我的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
为什么不工作?
答案 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
。