尽管明显不匹配,Grep 仍继续

尽管明显不匹配,Grep 仍继续

我有一个文件,其中的行都具有相同的模式:

Word word word word,more words here,0-9 more words here

我想找到第一个逗号之前的第一组单词包含 20 个或更多字符的行。我写

cat file.txt | grep -E "^[A-Z,a-z,[:space:]]{20,}[,]{1}"

我认为这会查找一个新行标记,然后查找一系列 20 个或更多字符的单词,然后查找一个逗号,然后停止。之后的单词不应该计算在内,因为那里没有换行标记。

但这也匹配逗号后的第二个单词串。为什么会这样呢?

感谢您的任何帮助。

答案1

[A-Z,a-z,[:space:]]匹配一个排序元素(可以是多个字符),该排序元素在A和之间Z按区域设置的排序顺序排序,或者是字符,,或者在 和 之间排序az或者是,字符,或者是在区域设置中被分类为空白的字符。

要匹配除 之外的任何一个字符,,只需[^,].要匹配分类为单词字符或空白的字符,它是[[:alpha:][:space:]](您可能希望添加到_与 perl 正则表达式等效的[\w\s])。要匹配 ASCII 字母或 ASCII 空格,如果您的 shell 支持$'...',则为$'[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz \t\r\f\v]'1。

所以:

<file.txt grep -E '^[^,]{20,},'

匹配以 20 个或更多非,字符开头且后跟 的行,

grep(其名称来自中的命令)打印与模式匹配的行。要仅打印这些行中的匹配部分,在某些实现中,您可以添加该选项(最初来自 GNU )。当发送到支持颜色的终端时,有些还可以用不同的颜色打印匹配的部分。g/regular expression/pedgrep-ogrep

但请注意,使用这些-o/ 时--colorgrep会尝试多次匹配正则表达式,并在上一个匹配结束后的行部分上重复搜索。您会发现某些实现grep无法正确执行此操作。例如,使用grepfrom ast-open:

$ echo aaa | grep -o '^a'
a
a
a

这是因为它确实a在行的开头找到了,然后通过在、行的其余部分等^a上应用正则表达式来继续查找更多匹配项。 aaGNU和busyboxgrep没有这个问题。

(注意这cat是连接文件的命令cat,这里不需要它)。


1 在 ASCII 中,还有换行又名\n,换行符^J通常被归类为空白,但它不能出现在行的内容中,因为它是行分隔符,并且它在参数中具有特殊含义,grep可以使用它来分隔多个正则表达式以在行上匹配,因此我们不想将其包含在这里

相关内容