【问题标题】:Replace line after match匹配后替换行
【发布时间】:2013-12-26 05:08:30
【问题描述】:

鉴于此文件

$ 猫 foo.txt AAA 111 BBB 222 CCC 333

我想将BBB 之后的第一行替换为999。我想出了这个命令

awk '/BBB/ {f=1; print; next} f {$1=999; f=0} 1' foo.txt

但我对任何带有 awk 或 sed 的较短命令感到好奇。

【问题讨论】:

  • 请记住,简洁本身并不是软件的理想品质,简洁(即简洁明了)才是。

标签: bash sed awk


【解决方案1】:
awk '/BBB/{print;getline;$0="999"}1' your_file

【讨论】:

    【解决方案2】:

    这有点短:

    awk 'f{$0="999";f=0}/BBB/{f=1}1' file
    

    f {$0="999";f=0} 如果f 为真,则将行设置为999f0
    /BBB/ {f=1} 如果模式匹配设置f1
    1打印所有行,因为1 始终为真。

    【讨论】:

    • 1 print all lines, since 1 is always true。事实上,它有点长“1 打印所有行,因为它被评估为真,awk 中“真”的默认操作是{print $0}”。另外,+1,我在尝试挤压单线时提出了相同的解决方案。
    【解决方案3】:

    也可以使用sed,它更短

    sed '/BBB/{n;s/.*/999/}'
    

    【讨论】:

    • 999/;}',缺少 ;对于符合 posix 的 ;-)
    【解决方案4】:

    这可能对你有用(GNU sed)

    sed '/BBB/!b;n;c999' file
    

    如果一行包含BBB,则打印该行,然后将以下行更改为999

    !b 否定前一个地址(正则表达式)并中断任何处理,结束 sed 命令,n 打印当前行,然后将下一行读入模式空间,c 将当前行更改为命令后面的字符串。

    【讨论】:

      【解决方案5】:
      $ awk '{print (f?999:$0); f=0} /BBB/{f=1}' file    
      AAA
      111
      BBB
      999
      CCC
      333
      

      【讨论】:

        【解决方案6】:
        sed 's/\(BBB\)/\1\
        999/'
        

        在 Mac 上工作

        【讨论】:

          猜你喜欢
          • 2018-02-26
          • 1970-01-01
          • 1970-01-01
          • 2021-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-01
          • 1970-01-01
          相关资源
          最近更新 更多