2010-03-22 239 views
3

我试图读取正则表达式的文件,循环它们并将它们从另一个文件中过滤出来。我非常接近,但我相信我的$ regex var替换存在问题。在bash脚本的awk命令中使用正则表达式

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

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

+0

它看起来像你希望这是一个空行,那里曾经是一个对的awk与你的正则表达式匹配吗?这就是为什么有ORS? – rescdsk 2010-03-22 15:03:17

回答

2

$regex没有得到扩展,因为它是单引号。在bash,扩展仅在doublequoted串完成:

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

所以,刚刚突破了你的字符串,像这样:

​​

,它会表现得如您所愿。 !不应被评估,因为这将执行历史记录中的最后一条命令。

0

我认为你有一个报价问题

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

通过你的shell变量使用-v选项

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