我试图用“' a'然后至少1 c,但不超过2 c。
所以我做的是:
grep '^ac{1,2}' place/file/input.txt > place/file/output.txt
对于像控告,行为,准确,金合欢这样的词,是不是说真的?但是当我运行一个断言时,它说False不是真的。
请让我知道我在这里忽略了什么。
答案 0 :(得分:2)
首先是一些测试材料:
$ cat file
a # miss
ac # miss without this comment
acc # miss without this comment
accc # miss
accd # hit
您需要转义{}
s(和?+|()
s):
$ grep 'ac\{1,2\}[^c]' file
accd
或
$ grep 'acc\?[^c]' file
accd
(...或使用in the other answer所述的扩展模式。)
答案 1 :(得分:0)
默认grep
模式不接受标准"扩展"正则表达式语法(感谢tripleee指出我的第一次写作有多么错误),所以你的语法没有像你期望的那样翻译。您可以使用egrep
或-E
:
grep -E '^ac{1,2}' place/file/input.txt > place/file/output.txt
-E
使用扩展正则表达式匹配。处理指定为ERE的每个模式,如IEEE Std 1003.1-2001的基本定义卷,第9.4节,扩展正则表达式中所述。如果任何整个ERE模式匹配输出行的某些部分(不包括终止),则该行应匹配。空ERE应匹配每一行。
来自POSIX文档
但是,3 c也是1或2后跟其他任何东西,所以你要确保下一个字符不是c:
grep -E '^ac{1,2}[^c]' place/file/input.txt > place/file/output.txt
此外,正如詹姆斯·布朗指出的那样,你可以逃脱许多角色,使grep
根据需要处理正则表达式而不使用-E
。