【问题标题】:Replace a text block with sed or awk用 sed 或 awk 替换文本块
【发布时间】:2014-05-21 07:26:13
【问题描述】:

这是来自文件的 sn-p:

COMMAND : /* some text 1 */
ACTION : /* some text 1 in multiple lines */
COMMAND : /* some text 2 */
ACTION : /* some text 2 in multiple lines */
.
.
.

这样下去。 我想使用 sed 或 awk 工具用另一个文本替换从 COMMAND 开始的文本,直到其对应的 ACTION(即在下一个 COMMAND 之前)。

所以如果我想删除第一个带有一些文本的 COMMAND-ACTION 组,结果如下。

USED SED/AWK HERE
COMMAND : /* some text 2 */
ACTION : /* some text 2 in multiple lines */
.
.
.

【问题讨论】:

  • 如果有很多,我们怎么知道你指的是哪个命令?
  • @MarkSetchell 每个命令后面的文本都不同,所以可能有用吗?
  • 行间有空行吗?
  • 既然你的COMMAND-ACTION 组是相等的,他们应该被替换吗?文本是否以/* 开头并以*/ 结尾?
  • 所以你想替换第一组,或第二组或两个组?

标签: awk sed


【解决方案1】:

对所有命令/动作通用

sed '/COMMAND/,/ACTION/ {
   /COMMAND/ i\
Put your new text \
and lines here
   d
   }' YourFile

具体置顶您的命令文本内容

SearchText='your pattern search text (reduce regex format)"

sed "/COMMAND.*${SearchText}/,/ACTION/ {
   /COMMAND/ i\
Put your new text \
and lines here
   d
   }" YourFile

【讨论】:

    【解决方案2】:

    您可以像这样使用awk,然后将替换文本放在一个名为repl.txt 的文件中:

    awk '/^COMMAND x/{del=1;print;system("cat repl.txt");next} {if(!del)print} /^ACTION/{del=0}' file
    

    基本上,当它找到您要查找的COMMAND 时,它会设置del 可识别对象,以便知道删除该操作,并打印COMMAND 并包含文件repo.txt 中的文本。然后它会删除它看到的所有行,直到它停止删除时看到以ACTION 开头的行。

    COMMAND x 是您要查找的特定命令。

    或者如果你的替换文本很小,你可以直接把你的替换文本放在 awk 中:

    awk '/^COMMAND x/{del=1;print;print "Replacement text";next} {if(!del)print} /^ACTION/{del=0}' file
    

    【讨论】:

      【解决方案3】:

      赞成:

      sed '/COMMAND/,/ACTION/ {
      /COMMAND/ i\
      Put your new text \
      and lines here
      d
      }' YourFile
      

      使用 awk(真的是 nawk 或 gawk,awk 没用)你可以这样做:

      replace='myReplaceBlockLine1\nmyReplaceBlockLine2'
      nawk '/COMMAND/,/ACTION/{ myvar=replace; gsub(/\\n/,"\n",myvar); print myvar; next} 1'
       "replace=$replace" input_file.txt
      

      两者都有缺点 - 不支持反向引用。 使用 awk 的好处 - 您可以添加一些逻辑,例如仅替换第一次出现或删除重复项

      【讨论】:

        【解决方案4】:

        使用这个:

        sed ':a;N;$!ba;s/\nACTION/ ACTION/g' | sed 's/ACTION.*$/MY_TEXT/g'
        

        【讨论】:

          【解决方案5】:

          这个GNU awk(由于 RS)应该跳过第一组

          awk -v RS="COMMAND :" 'NR>2 {print RS$0}' file
          COMMAND : /* some text 2 */
          ACTION : /* some text 2 in multiple lines */
          

          或者是你的意思:

          awk -v RS="COMMAND :" 'NR>1{$0=RS $0} NR==2 {$0="New text"}1' file
          
          New text
          COMMAND : /* some text 2 */
          ACTION : /* some text 2 in multiple lines */
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-07-02
            • 1970-01-01
            • 2010-10-27
            • 1970-01-01
            • 2011-01-23
            • 2012-10-14
            • 2015-04-24
            相关资源
            最近更新 更多