如何为原始模式搜索执行多个就地seds?

Joh*_*ern 2 regex unix shell sed

我是shell脚本的新手,我正试图解决问题.

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

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

Jan*_*lho 7

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


Wil*_*ell 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
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是一种荒诞(破坏硬链接)。