在bash脚本中使用awk命令中的regex

时间:2010-03-22 14:56:23

标签: regex bash awk

我正在尝试读取正则表达式的文件,循环它们并将它们从另一个文件中过滤掉。我很亲密,但我相信我的$ regex var替换问题。

while read regex
do
  awk -vRS= '!/$regex/' ORS="\n\n" $tempOne > $tempTwo
  mv $tempTwo $tempOne
done < $filterFile

$ tempOne和$ tempTwo是临时文件。 $ filterFile是包含正则表达式的文件。

3 个答案:

答案 0 :(得分:2)

$regex未展开,因为它是单引号。在bash中,扩展只能在双引号字符串中完成:

foo="bar"
echo '$foo'  # --> $foo
echo "$foo"  # --> bar

所以,就像这样分解你的字符串:

'!'"/$regex/"

它会表现得像你期望的那样。不应评估!,因为这将执行历史记录中的最后一个命令。

答案 1 :(得分:2)

使用-v选项

将shell变量传递给awk
while read regex
do
  awk -vRS= -vregex="$regex" '$0!~regex' ORS="\n\n" $tempOne > $tempTwo
  mv $tempTwo $tempOne
done < $filterFile

答案 2 :(得分:0)

我认为你有引用问题

$ regex=asdf
$ echo '!/$regex/'
!/$regex/
$ echo "!/$regex/"
bash: !/$regex/: event not found
$ echo "\!/$regex/"
\!/asdf/
$ echo '!'"/$regex/"
!/asdf/