如何为一个原始模式搜索做多个原位种子?

时间:2012-09-27 19:02:34

标签: regex shell unix sed

我是shell脚本的新手,正在尝试解决问题。

基本上,我需要在文本文件中找到REGEX模式的实例,对每个结果进行一些sed编辑,然后将结果输出到原始文本文件而不会打扰任何其他原文。

我面临的心理障碍是:a)我需要做多个模式替换以完成最终的转换结果,所以它不能适合单个调用sed,而b)如果我grep用REGEX模式输出结果,它只给出了与该模式匹配的结果。好的,所以我继续编辑它们以将它们转换为最终所需的输出,但我想将这个更改准确地写在文本文件中的位置。您不能pipe grepsed -i,因为它不再引用原始文件,只是结果集。我是以错误的方式思考这个问题,还是有一些我不知道的命令?

2 个答案:

答案 0 :(得分:7)

在使用sed用于寻址的工具应用命令之前,您可以“grep”:

sed '/grep-like regex/ s/pattern to replace/replacement/' -i file

“-i file”告诉sed编辑“文件”。

可以通过分号或通过带有多个“-e”选项的命令行分隔多个命令:

sed -e '/regex1/ s/pattern1/replacement/' -e '/regex2/ s/pattern2/replacement/'
sed '/regex1/ s/pattern1/replacement/; /regex2/ s/pattern2/replacement/'

如果在上面的示例中regex1和regex2相同,您还可以使用支持将替换命令分组到一个块中:

sed '/regex/ { s/pattern1/replacement/; s/pattern2/replacement/ }'

或为了清楚起见:

sed '/regex/ {
        s/pattern1/replacement/
        s/pattern2/replacement/
    }'

您还可以通过嵌套/ regexes /:

进一步过滤行以应用命令
sed '/regex1/ {
        s/pattern1/replacement/
        /regex2/ s/pattern2/replacement/
    }'

因此,仅当regex1和regex2匹配时才执行第二个替换命令。

答案 1 :(得分:5)

sed可以很好地处理多个替换:sed 's/p1/r1/g; s/p2/r2/g'

但是如果要编辑文件,请不要使用流编辑器。 seded的流式版本。如果要编辑文件,只需使用ed即可。

echo ',s/pattern/repl/g;,s/pattern2/repl2/g;w' | tr \; \\012 | ed -s file

鉴于您的评论,我认为您只想在符合特定模式的行上进行搜索和替换。例如,要在包含'qux'的所有行上将'foo'替换为'bar',您可以执行以下操作:

echo '/qux/s/foo/bar;w' | tr \; \\012 | ed -s file

请注意我使用ed时有点滑稽。你可以用sed完成同样的事情:

sed '/qux/s/foo/bar' file

但是sed -i是一种讽刺(它打破了硬链接)。