【问题标题】:linux shell: prepend or append text to next line after matching linelinux shell:在匹配行之后将文本添加到下一行
【发布时间】:2013-08-21 21:55:07
【问题描述】:

在 Linux 中使用 shell 脚本(bash 或 csh)。我想找到与给定文本模式匹配的所有行,并为每一行添加或附加(取决于应用程序)文本到下一行。

例如,对于包含如下行的文件:

HEADER 1
 12345

HEADER 2
 12345

HEADER 1
 12345

HEADER 2
 12345

如果我正在搜索“HEADER 1”,并且想要附加文本“ABCDE”,输出将是这样的:

HEADER 1
 12345 ABCDE

HEADER 2
 12345

HEADER 1
 12345 ABCDE

HEADER 2
 12345

我也有一些情况,我希望 ABCDE 在 12345 之前。

我一直试图了解 sed 用于此目的的用法,但我感到受阻。任何指针将不胜感激。

【问题讨论】:

    标签: linux shell replace sed append


    【解决方案1】:

    sed 是用于在单行上进行简单替换的出色工具,对于其他任何事情,只需使用 awk 来实现可移植性、可扩展性、简单性、可读性等:

    $ awk 'found{print $0, "ABCDE"; found=0; next} {print} /HEADER 1/{found=1}' file
    HEADER 1
     12345 ABCDE
    
    HEADER 2
     12345
    
    HEADER 1
     12345 ABCDE
    
    HEADER 2
     12345
    

    而前置只是“ABCDE”和$0的顺序的明显切换:

    $ awk 'found{print "ABCDE", $0; found=0; next} {print} /HEADER 1/{found=1}' file
    HEADER 1
    ABCDE  12345
    
    HEADER 2
     12345
    
    HEADER 1
    ABCDE  12345
    
    HEADER 2
     12345
    

    如果您使用 s、g、p(带 -n)以外的 sed 语言结构,那么您使用的工具是错误的,因为在 1970 年代中期,当 awk 被发明时,所有其他 sed 语言结构都已过时。

    如果您对此表示怀疑,请尝试修改产生上述输出的 sed 脚本以执行其他任何操作,例如打印在每行末尾添加 ABCDE 的次数。这是awk:

    $ awk 'found{print $0, "ABCDE", ++count; found=0; next} {print} /HEADER 1/{found=1}' file
    HEADER 1
     12345 ABCDE 1
    
    HEADER 2
     12345
    
    HEADER 1
     12345 ABCDE 2
    
    HEADER 2
     12345
    

    我不敢想象 sed 做这么简单的事情会是什么样子。

    【讨论】:

      【解决方案2】:

      试试这个命令:

      sed '/HEADER 1/{n;s/$/ ABCDE/}' input.txt
      

      这是逻辑:

      for each line in 'input.txt'    
          if line matches /HEADER 1/
              read next line
              append string ' ABCDE'
          endif    
      endfor
      

      【讨论】:

      • 对于追加,当我与 sed 文档保持一致时,这有效并且有意义。通过扩展,我希望这可以用于前置: {n;s/^/foo /}
      • 使用 s/^/ABCDE / 前置。
      • 如何修改它以处理带有斜杠的路径变量(例如 MYPATH=/home/user/tools) sed '/HEADER 1/{n;s/$/ $MYPATH/}' 输入.txt 显然不起作用
      【解决方案3】:

      如果您对一般的文本管道 linux 应用程序感到困惑,我建议您通过 this exercise on the Learn Linux the Hard Way course。应该需要 4-5 分钟,而且会有很大帮助。

      【讨论】:

      • 感谢您的指点,我很乐意通读。我想加深对 sed、awk 等的理解。
      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2015-06-18
      • 2014-09-04
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      相关资源
      最近更新 更多