2

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

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

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

4

2 回答 2

7

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

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

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

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

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

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

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 匹配时才执行第二个替换命令。

于 2012-09-27T19:32:06.960 回答
5

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

但是如果你想编辑一个文件,不要使用流编辑器。 sed是的流媒体版本ed。如果要编辑文件,只需使用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是一个讽刺(它破坏了硬链接)。

于 2012-09-27T19:05:48.337 回答