我正在尝试注释脚本中存在给定模式列表中的模式的行。现在,我可以在命令行上按以下方式执行此操作:
sed '/abcdefg/ s/^/#/' file.sql > file.commented
但是,如果我为模式使用变量(而不是像上面那样直接使用 abcdefg),我将无法执行相同的操作。
pattern=abcdefg
sed '/$pattern/ s/^/#/' file.sql > file.commented
看起来它正在转义美元字符而不是获取变量的值。
如何用 awk 做同样的事情?
您需要使用双引号才能在 shell 中使用变量:
sed "/$pattern/ s/^/#/" file.sql > file.commented
您还可以使用 shell 的内联特性来保存输入文件本身的更改
sed -i.bak "/$pattern/ s/^/#/" file.sql
但是,最好避免使用 sed
来完成这项工作,因为它使用正则表达式,如果 $pattern
包含 ,上面的命令将会中断/
或一些特殊的正则表达式元字符。最好像这样使用 awk
:
awk -v p="$pattern" 'index($0, p) {$0 = "#" $0} 1' file.sql > file.commented