在 GNU Sed 中用 1) 代替 1,用 2) 代替 2,...

Léo*_* 준영 4 sed text-processing

伪代码是这个答案的延续

gsed 's/|/1)/g' 's/|/2)/2g' 's/|/3)/3g' 's/|/5)/4g' 's/|/5)/5g' 
<input.csv >output.csv
Run Code Online (Sandbox Code Playgroud)

这当然不起作用。我对如何gsed管理这样的循环感兴趣。

如何gsed扩展到这样的循环?

lcd*_*047 5

对于上述情况,您可以这样做:

gsed 's/|/1)/; s/|/2)/; s/|/3)/; s/|/4)/; s/|/5)/'
Run Code Online (Sandbox Code Playgroud)

例子:

$ echo '| | | | |' | sed 's/|/1)/; s/|/2)/; s/|/3)/; s/|/4)/; s/|/5)/'
1) 2) 3) 4) 5)
Run Code Online (Sandbox Code Playgroud)

如果您可以提前估计|一行的最大数量,并相应地添加s/|/N)/,则此方法有效。

如果您无法估计|一条线上的最大数量,它仍然可以gsed使用保持缓冲区中的计数器来完成,并使用这个聪明的设备增加它Bruno Haible 的。不过,实际的实现有点棘手,因此我将把它留给受虐狂精明的读者。

当然,最简单的方法是使用awk

awk '{ cnt = 0; while(sub(/\|/, ++cnt ")")); print }'
Run Code Online (Sandbox Code Playgroud)

证明:

$ echo '| | | | |' | awk '{ cnt = 0; while(sub(/\|/, ++cnt ")")); print }'
1) 2) 3) 4) 5)
Run Code Online (Sandbox Code Playgroud)