在bash
脚本中,如何sed
写入文件名存储在 bash 变量中的文件?输出重定向不起作用,因为我想就地编辑一个文件,将匹配正则表达式的行拉到另一个文件中并在第一个文件中删除它们。
就像是:
sed -i '/^my regex here$/{;w file2;d;}' file1
Run Code Online (Sandbox Code Playgroud)
...但 wherefile1
和file2
两者实际上都是保存文件名的变量。(比如。)file2=$(mktemp)
所以我真正想要的是文件名的变量扩展,但sed
命令的其余部分没有扩展,并将整个内容作为传递给sed
命令的单个参数。
无论出于何种原因,以下操作都不起作用:
sed -i '/my regex here/{;w '"$file2"';d;}' $file1
Run Code Online (Sandbox Code Playgroud)
它说“无与伦比的{”,我不明白为什么。
我有什么办法可以做到这一点?
因为您使用的是单个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)