【问题标题】:Replace 3 lines with another line SED Syntax用另一行替换 3 行 SED 语法
【发布时间】:2021-07-02 01:26:33
【问题描述】:

这是一个简单的问题,我不确定我是否能够使用 sed/awk 做到这一点 如何使 sed 搜索这 3 行并替换为具有确定字符串的行?

<Blarg>
<Bllarg>
<Blllarg>

替换为

<test>

我尝试使用 sed "s/&lt;Blarg&gt;\n&lt;Bllarg&gt;\n&lt;Blllarg&gt;/&lt;test&gt;/g" 但它似乎没有找到这些行。可能与我的换行符(?)\n有关。我错过了什么吗?

【问题讨论】:

    标签: sed


    【解决方案1】:

    因为 sed 通常一次只处理一行,所以您的模式永远不会匹配。试试这个:

    sed '1N;$!N;s/<Blarg>\n<Bllarg>\n<Blllarg>/<test>/;P;D' filename
    

    【讨论】:

    • 对不起,它确实有效。不要使用 ,而是使用 ,让它不起作用。 (infile 也改了)
    • @ghaschel,如果它在您的真实文件中不起作用,请给我们更多信息,也许我们可以提供帮助。
    • 它搜索,找到文本块,替换为 并且不替换文件中的另一个匹配项。
    • @ghaschel 替换文件中的所有此类块,使用:sed ':a;/\n/!{$!N};$!N;s/&lt;Blarg&gt;\n&lt;Bllarg&gt;\n&lt;Blllarg&gt;$/&lt;test&gt;/;ta;P;D'
    【解决方案2】:

    这可能对你有用:

    sed '/<Blarg>/ {N;N;s/<Blarg>\n<Bllarg>\n<Blllarg>/<test>/}' <filename>
    

    它的工作原理如下:

    • 搜索文件直到找到&lt;Blarg&gt;
    • 然后使用N;N; 将以下两行附加到当前模式空间
    • 检查当前模式空间是否匹配&lt;Blarg&gt;\n&lt;Bllarg&gt;\n&lt;Blllarg&gt;
    • 如果是这样,则将其替换为&lt;test&gt;

    【讨论】:

    • 它就像一个魅力。在测试文件中,但是当我尝试在我需要的文件中时,它就无法工作......
    • 你能编辑你的问题并添加实际文件的内容吗?
    • 这不适用于 ` echo -e '\n\n\n'
    【解决方案3】:

    您可以将range addresses 与正则表达式和c 命令一起使用,这正是您所要求的:

    sed '/<Blarg>/,/<Blllarg>/c<test>' filename
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2022-01-11
      相关资源
      最近更新 更多