如何搜索和替换文件中匹配部分的多个模式? 我尝试过了
sed '/pattern1,pattern2/s/string1/replace1/g;s/string2/replace2/g' file
但是它将忽略pattern1,pattern2部分,并在第二次搜索和替换时搜索并替换整个文件。
答案 0 :(得分: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
。
还...也许我们可以获取样本文件进行测试?这些只是临时输入的,但是如果您提供了示例数据,那么在提交可能存在拼写错误或逻辑缺陷的内容之前,我实际上将首先使用它来对其进行测试。只是一个建议。如果您不让他们屈服所有片段,人们将更可能变得彻底,大声笑
答案 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