使用sed递归替换字符串

时间:2013-10-18 15:07:23

标签: bash shell recursion sed

我有一个带有以下字符串的文件:

||||||

我想用||替换|""|的每一次出现,所以我使用了

sed 's/||/|\"\"|/g' temp2.csv

但我得到了输出:

|""||""||""|代替|""|""|""|""|""|

我发现sed没有递归替换,我怎么能让sed以递归方式进行替换,所以只有当前一行没有||

时,它才会转移到下一行

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

最直接的方式是将sed替换称为两次。但是我觉得这个sed单行可能会更好,因为如果你说,我想以递归方式将|||..{n}..|替换为|""|""|...{n}..|""|

sed ':a s/||/|""|/g; t a' file

使用您的数据进行测试:

kent$  cat f
||||||

kent$  sed ':a s/||/|""|/g; t a' f
|""|""|""|""|""|

答案 1 :(得分:2)

sed不支持lookahead或lookbehind,但在你的情况下你可以再次传递:

<temp2.csv sed 's/||/|\"\"|/g' | sed 's/||/|\"\"|/g'

答案 2 :(得分:-2)

使用awk即可:

#echo '||||||' | awk '{gsub(/\|\|/,"|\"\"|")}1'
|""||""||""|