我是shell脚本的新手,正在尝试解决问题。
基本上,我需要在文本文件中找到REGEX
模式的实例,对每个结果进行一些sed
编辑,然后将结果输出到原始文本文件而不会打扰任何其他原文。
我面临的心理障碍是:a)我需要做多个模式替换以完成最终的转换结果,所以它不能适合单个调用sed,而b)如果我grep用REGEX
模式输出结果,它只给出了与该模式匹配的结果。好的,所以我继续编辑它们以将它们转换为最终所需的输出,但我想将这个更改准确地写在文本文件中的位置。您不能pipe
grep
到sed -i
,因为它不再引用原始文件,只是结果集。我是以错误的方式思考这个问题,还是有一些我不知道的命令?
答案 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'
但是如果要编辑文件,请不要使用流编辑器。 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
是一种讽刺(它打破了硬链接)。