【问题标题】:replace when found a pattern in multiple lines using sed使用 sed 在多行中找到模式时替换
【发布时间】:2013-12-04 03:38:51
【问题描述】:

我必须在 shell 脚本中使用 sed 来更正与此类似的文本:

>ABC    25  15
>
>FILE   def.exe 3
>INDEX
>
>ABC    12  40
>
>FILE   abc.exe 2
>INDEX
>
>ABC    20  18
>
>FILE   def.exe 5
>INDEX
>
>

我需要更改“DEF”的“ABC”模式,每次后续行显示“FILE def.exe”。请注意,在“ABC”行和“FILE”行之间必须保留一个空白行。在过程结束时,文件必须是这样的:

>DEF    25  15
>
>FILE   def.exe 3
>INDEX
>
>ABC    12  40
>
>FILE   abc.exe 2
>INDEX
>
>DEF    20  18
>
>FILE   def.exe 5
>INDEX
>
>

我尝试使用带有 c 选项的 sed 来替换一段文本,但没有成功。如果有人有建议,我将不胜感激。

【问题讨论】:

    标签: regex bash shell sed


    【解决方案1】:
    sed  '/^>ABC/{N;N;/FILE[ ]*def.exe/s/>ABC/>DEF/}' input
    

    如果要修改输入文件,请将-i 选项添加到 sed。

    生产:

    >DEF    25  15
    >
    >FILE   def.exe 3
    >INDEX
    >
    >ABC    12  40
    >
    >FILE   abc.exe 2
    >INDEX
    >
    >DEF    20  18
    >
    >FILE   def.exe 5
    >INDEX
    >
    >
    

    【讨论】:

    • 我们运行的是同一个sed吗?因为这对我不起作用。 Ubuntu 13.10,bash4.2sed4.2
    • @gongzhitaao 我相信 perreal 是基于问题中显示的文本的正则表达式。您刚刚删除了“>”字符。
    • @cosjav 哎呀,错过了。
    • 我正要发布一个涉及首先阅读所有内容的答案,但 perreals 的答案更好:-)
    • @gongzhitaao,当我们已经在缓冲区中有ABC行时,只需要两个N
    【解决方案2】:

    使用gnu awk(由于记录选择器)

    awk '/def.exe/ {sub(/>ABC/,">DEF")} {print $0 RS}' RS="INDEX" file
    >DEF    25  15
    >
    >FILE   def.exe 3
    >INDEX
    
    >
    >ABC    12  40
    >
    >FILE   abc.exe 2
    >INDEX
    
    >
    >DEF    20  18
    >
    >FILE   def.exe 5
    >INDEX
    
    >
    >
    INDEX
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多