Joh*_*ern 2 regex unix shell sed
我是shell脚本的新手,我正试图解决问题.
基本上,我需要REGEX
在文本文件中查找模式的实例,sed
对每个结果进行一些编辑,然后将结果输出到原始文本文件而不会干扰任何其他原始文本.
我面临的心理障碍是:a)我需要做多个模式替换以完成最终的转换结果,所以它不能适合单个调用sed,而b)如果我grep out结果使用REGEX
模式,它只给我匹配该模式的结果.好的,所以我继续编辑它们以将它们转换为最终所需的输出,但我想将这个更改准确地写在文本文件中的位置.你不能pipe
grep
,sed -i
因为它不再引用原始文件,只是结果集.我是以错误的方式思考这个问题,还是有一些我不知道的命令?
在使用sed的设备应用命令进行寻址之前,您可以"grep":
sed '/grep-like regex/ s/pattern to replace/replacement/' -i file
Run Code Online (Sandbox Code Playgroud)
其中"-i文件"告诉sed编辑"文件"到位.
可以通过分号或通过带有多个"-e"选项的命令行分隔多个命令:
sed -e '/regex1/ s/pattern1/replacement/' -e '/regex2/ s/pattern2/replacement/'
sed '/regex1/ s/pattern1/replacement/; /regex2/ s/pattern2/replacement/'
Run Code Online (Sandbox Code Playgroud)
如果在上面的示例中regex1和regex2相同,您还可以使用支持将替换命令分组到单个块中:
sed '/regex/ { s/pattern1/replacement/; s/pattern2/replacement/ }'
Run Code Online (Sandbox Code Playgroud)
或者为了清楚起见:
sed '/regex/ {
s/pattern1/replacement/
s/pattern2/replacement/
}'
Run Code Online (Sandbox Code Playgroud)
您还可以通过嵌套/ regexes /来进一步过滤行以应用命令:
sed '/regex1/ {
s/pattern1/replacement/
/regex2/ s/pattern2/replacement/
}'
Run Code Online (Sandbox Code Playgroud)
因此,仅当regex1和regex2匹配时才执行第二个替换命令.
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
Run Code Online (Sandbox Code Playgroud)
鉴于您的评论,我想您想进行搜索并仅替换与特定模式匹配的行。例如,要在所有包含“ qux”的行上将“ foo”替换为“ bar”,可以执行以下操作:
echo '/qux/s/foo/bar;w' | tr \; \\012 | ed -s file
Run Code Online (Sandbox Code Playgroud)
请注意,我对使用有点face ed
。您可以使用sed做完全相同的事情:
sed '/qux/s/foo/bar' file
Run Code Online (Sandbox Code Playgroud)
但这sed -i
是一种荒诞(破坏硬链接)。