【问题标题】:Replace string recursively using sed使用 sed 递归替换字符串
【发布时间】:2013-10-18 23:23:49
【问题描述】:

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

||||||

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

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

但我得到的输出是:

|""||""||""| 而不是|""|""|""|""|""|

我发现 sed 没有递归地进行替换,我怎样才能让 sed 递归地进行替换,以便只有在上一行没有出现 || 时才移动到下一行

感谢您的帮助。

【问题讨论】:

    标签: bash shell recursion sed


    【解决方案1】:

    最直接的方法是调用 sed 替换两次。但我认为这个 sed 单线可能更好,因为如果你说它可以工作,我想递归地将 |||..{n}..| 替换为 |""|""|...{n}..|""|

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

    使用您的数据进行测试:

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

    【讨论】:

    • 您能解释一下:at a 的作用吗?它可以用于比s/// 更复杂的事情吗?
    【解决方案2】:

    sed 不支持lookahead 或lookbehind,但在您的情况下,您可以进行第二遍:

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

    【讨论】:

      【解决方案3】:

      使用awk 你可以这样做:

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

      【讨论】:

      • 结果与OP的预期不一样。请检查问题两次。
      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 2011-05-09
      • 2011-09-27
      相关资源
      最近更新 更多