如何使用 sed 写入存储在变量中的文件名?

Wil*_*ard 5 sed

bash脚本中,如何sed写入文件名存储在 bash 变量中的文件?输出重定向不起作用,因为我想就地编辑一个文件,将匹配正则表达式的行拉到另一个文件中并在第一个文件中删除它们。

就像是:

sed -i '/^my regex here$/{;w file2;d;}' file1
Run Code Online (Sandbox Code Playgroud)

...但 wherefile1file2两者实际上都是保存文件名的变量。(比如。)file2=$(mktemp)

所以我真正想要的是文件名的变量扩展,但sed命令的其余部分没有扩展,并将整个内容作为传递给sed命令的单个参数。

无论出于何种原因,以下操作都不起作用:

sed -i '/my regex here/{;w '"$file2"';d;}' $file1
Run Code Online (Sandbox Code Playgroud)

它说“无与伦比的{”,我不明白为什么。

我有什么办法可以做到这一点?

don*_*sti 4

因为您使用的是单个sed表达式,所以后面的所有内容w(包括})都被解释为wfile name

该参数wfile应终止编辑命令。

您可以看到,如果添加第二个命令,}例如:

sed -e '/my regex here/{w '"$file2"';d;}' -e '}' $file1
Run Code Online (Sandbox Code Playgroud)

那么匹配的行将my regex here保存在名为whatever;d;}wherewhatever$file1扩展后的文件中。
正确的语法是通过单独的命令,或者使用多个表达式:

sed -e '/my regex here/{w '"$file1" -e 'd' -e '}' $file2
Run Code Online (Sandbox Code Playgroud)

或每行一个命令:

sed '/my regex here/{
w '"$file1"'
d
}
' $file2
Run Code Online (Sandbox Code Playgroud)