将字符串添加到包含模式的行的开头

Add a string to the beginning of a line containing a pattern

我正在尝试注释脚本中存在给定模式列表中的模式的行。现在,我可以在命令行上按以下方式执行此操作:

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([=12=], p) {[=12=] = "#" [=12=]} 1' file.sql > file.commented