使用grep进行高飞的bash插入

时间:2015-10-14 17:58:15

标签: regex bash shell grep

我的file.txt包含:

ab
cb

我想找到b未进行的a

以下应work

grep -e "(?<!a)b" file.txt

但相反它会返回:

grep -e "(?<awk '1{ if(  NR % 2 == 0 && NR % 4 != 0) print }' ../../path/to/somedata.txt  | grep "A$" | wc -l)b" file.txt

awk '1{ if( NR % 2 == 0 && NR % 4 != 0) print }' ../../path/to/somedata.txt | grep "A$" | wc -l是上一个命令。

似乎替换了!?这里发生了什么,我的grep -e "(?<!a)b" file.txt为什么不工作?

2 个答案:

答案 0 :(得分:3)

在交互式shell中,!用于history substitution。您需要使用反斜杠转义它或将其放在单引号内以防止这种情况发生。将代码放入脚本时,这不应成为问题;默认情况下,脚本中禁用历史记录扩展。

此外,如果您想使用像lookbehind这样的PCRE功能,则必须使用-P选项grep(假设您使用的是GNU grep)。

答案 1 :(得分:3)

-P中的gnu-grep(PCRE)选项支持否定前瞻。正如Barmar has answered所示,您需要在单引号中使用!以避免history扩展。

但是,如果您使用扩展grep,则可以使用此正则表达式:

grep -E '(^|[^a])b' file

它会匹配任何位于行开头或前面有b字符的non-a