0

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

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

但它会忽略 pattern1、pattern2 部分,并为我的第二次搜索和替换搜索和替换整个文件。

4

2 回答 2

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
于 2019-05-29T20:45:32.760 回答
0

卷发。

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

/pattern1,pattern2/只是搜索字面上的“pattern1,pattern2”作为单个字符串。

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

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.

另外......也许我们可以得到一个样本文件来测试?这些只是即兴打字,但如果你提供了示例数据,我实际上会先用它来测试它们,然后再提交可能有错字或逻辑缺陷的东西。只是一个建议。如果你不让他们生成所有的碎片,人们将更有可能做到彻底,哈哈

于 2019-05-29T13:24:33.970 回答