【问题标题】:replace string in pattern using shell command: sed, awk使用 shell 命令替换模式中的字符串:sed、awk
【发布时间】:2014-10-19 21:45:47
【问题描述】:

假设我有一个这样的文本文件:

a;bc;d;{a;b;cd}
ab;cde;f;{ab;c;defg}
ab;{a;b;cd};cde;f
...

我想用逗号替换所有花括号中的分号。替换后是这样的:

a;bc;d;{a,b,cd}
ab;cde;f;{ab,c,defg}
ab;{a,b,cd};cde;f
...

我应该如何在 shell 命令中执行此操作? sed、awk 或其他...

【问题讨论】:

  • 大括号是否平衡或嵌套?

标签: regex bash shell awk sed


【解决方案1】:

Perl 的救援:

perl -pe 's/({.*?})/ $1 =~ s=;=,=gr /ge' input

问题是你的预期输出是错误的:

a;b;cd         a;b;cd
  |               |
  V               V
a,b,c,d         ab,cd

【讨论】:

    【解决方案2】:

    通过使用positive lookahead的perl,

    $ perl -pe 's/;(?=[^{}]*})/,/g' file
    a;bc;d;{a,b,cd}
    ab;cde;f;{ab,c,defg}
    ab;{a,b,cd};cde;f
    

    【讨论】:

      【解决方案3】:
      sed ':a; s/\(.*\)\({\)\([^;]*\)\(;\)\([^}]*}.*\)/\1\2\3,\5/;t a' file
      

      在开头放一个标签,然后将部分关闭保持模式并循环,直到每行没有更多成功的替换(t a)

      E.g.  
      a;bc;d;{a;b;cd}morestuff{bsdj;dsfkjl;sdkjl;kd}
      ab;cde;f;{ab;c;defg}
      ab;{a;b;cd};cde;f
      
      Output: 
      a;bc;d;{a,b,cd}morestuff{bsdj,dsfkjl,sdkjl,kd}
      ab;cde;f;{ab,c,defg}
      ab;{a,b,cd};cde;f
      

      【讨论】:

        猜你喜欢
        • 2015-03-05
        • 2017-02-08
        • 1970-01-01
        • 2015-01-13
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多