Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在包含图案的行首添加字符串_Regex_Bash_Awk_Sed_Vi - Fatal编程技术网

Regex 在包含图案的行首添加字符串

Regex 在包含图案的行首添加字符串,regex,bash,awk,sed,vi,Regex,Bash,Awk,Sed,Vi,我试图注释脚本中存在给定模式列表中的模式的行。现在,我可以在命令行上通过以下方式执行此操作: sed '/abcdefg/ s/^/#/' file.sql > file.commented 但是,如果我为模式使用变量(而不是像上面那样直接使用abcdefg),我就不能这样做 pattern=abcdefg sed '/$pattern/ s/^/#/' file.sql > file.commented 看起来它正在转义美元字符,而不是获取变量的值 如何对awk执行相同的操作?

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

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

你在StackOverflow里花了十秒钟寻找答案吗?这个问题已经被问了几百次了,很抱歉。但是我昨天也找了,在这里浪费时间之前尝试了不同的方法。我将删除这个问题。@AjimBagwan:不要删除这个问题,因为下面已经发布了带有非正则表达式选项的答案,这可能会帮助其他读者。@AjimBagwan:我认为,一旦你问了这个问题,就没有必要删除它,因为有些用户花时间来帮助你。该死!我试过了,但忽略了它,认为它不起作用。但它是有效的。谢谢。你用AWK怎么办?不客气,看我的更新答案,考虑使用<代码> AWK<代码>上面的代码> SED因为上面的原因。我已经在回答中提供了等效的AWK命令。AWK版本只打印匹配的行(前面有一个字母)。它不像sed那样将不匹配的行重定向到文件。索引($0,p)到底做什么?