使用 sed 用多行字符串替换匹配项

Tyi*_*ilo 3 sed awk

可能的重复:
将多行字符串插入另一个字符串

我有一个名为的文件,foo.txt其中包含:

富
酒吧
巴兹

我想bar用存储在变量中的多行字符串替换每次出现$bar

1
2
3

导致:

富
1
2
3
巴兹

我可以awk使用以下方法做到这一点:

echo "$bar" | awk '{
        如果(文件名==“-”)
        {
            如果(我!=“”)
            {
                我 = 我"\n"
            }
            我=我$0
        }
        别的
        {
            if($0 == "bar")
            {
                打印我
            }
            别的
            {
                打印
            }
        }
    }'

但是,尝试在sedusing 中执行相同操作sed 's/bar/'"$bar"'/' foobar.txt会出现错误:

sed: 1: "s/bar/1
2
3/": 替代模式内未转义的换行符

这可以解决吗?

如果使用其他标准工具有更简单的方法来做到这一点,我也想知道。

Sté*_*las 5

在 中sed,必须在s命令的右侧转义换行符,因此您需要编写它:

sed 's/foo/1\
2\
3/g'
Run Code Online (Sandbox Code Playgroud)

一些sed实现还支持(非标准):

sed 's/foo/1\n2\n3/g'
Run Code Online (Sandbox Code Playgroud)

如果$bar要替换,您首先需要在每个换行符之前插入一个反斜杠。在此过程中,您还应该在每个斜杠、反斜杠和与号字符之前插入一个反斜杠。

就像是:

bar_escaped=$(printf '%s\n' "$bar" | sed 's,[\/&],\\&,g;s/$/\\/')
bar_escaped=${bar_escaped%?}
sed "s/foo/$bar_escaped/g"
Run Code Online (Sandbox Code Playgroud)