SED搜索并替换超过1个模式(如果匹配的行)

时间:2019-05-29 12:28:13

标签: bash sed

如何搜索和替换文件中匹配部分的多个模式? 我尝试过了

sed '/pattern1,pattern2/s/string1/replace1/g;s/string2/replace2/g' file

但是它将忽略pattern1,pattern2部分,并在第二次搜索和替换时搜索并替换整个文件。

2 个答案:

答案 0 :(得分:0)

当然。

为了记录,这是GNU sed的记录,您似乎正在使用它。对于其他版本/可移植性,请用换行符替换分号。

另外,/pattern1,pattern2/仅将字面意义上的“ pattern1,pattern2”作为单个字符串进行搜索。

如果我没看错,您想对同时具有pattern1pattern2的行进行一些替换,尽管不一定在任何相对位置。在这种情况下:

sed '
  /pattern1/ { 
    /pattern2/ { 
      s/string1/replace1/g;
      s/string2/replace2/g;
    }
  }
' file

出于可读性考虑,我将其隔开了,但是如果您确实愿意,可以将它们全部粉碎成一行。

如果您知道 pattern1总是早于pattern2,那么您可以使用

sed '/pattern1.*pattern2/ { 
  s/string1/replace1/g; s/string2/replace2/g;
}' file

但是如果它们的顺序可以相反,请使用第一个sed

还...也许我们可以获取样本文件进行测试?这些只是临时输入的,但是如果您提供了示例数据,那么在提交可能存在拼写错误或逻辑缺陷的内容之前,我实际上将首先使用它来对其进行测试。只是一个建议。如果您不让他们屈服所有片段,人们将更可能变得彻底,大声笑

答案 1 :(得分:0)

sed用于对单个字符串进行s / old / new。假设根据周围的描述,/pattern1,pattern2/实际上是/pattern1/,/pattern2/的意思,那么在任何UNIX盒的任何shell中都带有任何awk:

awk '
/pattern1/ { f=1 }
f {
    gsub(/string1/,"replace1")
    gsub(/string2/,"replace2")
}
/pattern2/ { f=0 }
1' file