如何grep特定的元素名称

时间:2017-10-03 01:04:27

标签: bash unix

我试图用“' a'然后至少1 c,但不超过2 c。

所以我做的是:

grep '^ac{1,2}' place/file/input.txt > place/file/output.txt

对于像控告,行为,准确,金合欢这样的词,是不是说真的?但是当我运行一个断言时,它说False不是真的。

请让我知道我在这里忽略了什么。

2 个答案:

答案 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