以特定字符结尾的字符串的grep

问题描述:

有没有办法使用扩展正则表达式来查找以字符串结尾的特定模式。以特定字符结尾的字符串的grep

我的意思是,我想匹配前3行,但不是最后一次:

file_number_one.pdf # comment 
file_number_two.pdf # not interesting 
testfile_number____three.pdf # some other stuff 
myfilezipped.pdf.zip some comments and explanations 

我知道,在grep的,元字符$行的结尾匹配,但我不感兴趣的匹配线结束但字符串结束。 grep中的组非常奇怪,我还没有很好地理解它们。

我试图与组匹配,其实我也有类似的正则表达式,但它不使用grep -E

(\w+).pdf$ 

的工作是有没有办法做的grep/egrep的结尾匹配字符串?

你的例子使用字符串还后面的空格匹配:

grep -E '\.pdf ' input.txt 

你叫什么“string”类似于grep调用的“word”。一个字是一个字母数字字符的运行。带词的好处是,您可以将单词末尾与特殊的\>匹配,该单词末尾匹配零个字符长度的行进。这也匹配在行末。但是字符不能改变,也不能包含标点符号,所以我们不能使用它。

如果您需要在一行的末尾匹配过,那里是单词后没有空间,用途:

grep -E '\.pdf |\.pdf$' input.txt 

要包括情况下,文件名后的字符不是空格字符“ ”,但其他的空白,就像一个标签,\t,或名字,随后直接评论,从#,用途:

grep -E '\.pdf[[:space:]#]|\.pdf$' input.txt 

我将说明文字boundarys的匹配也是如此,因为这将是这是一个完美的解决方案,除了我们不能在这里使用它,因为我们不能改变被看作是单词的一部分的字符集。

输入包含foo作为单独的字,并作为较长词的一部分,其中该foo不是在字的结尾,因此不是在字边界:

$ printf 'foo bar\nfoo.bar\nfoobar\nfoo_bar\nfoo\n' 
foo bar 
foo.bar 
foobar 
foo_bar 
foo 

现在,以匹配字的边界,我们可以使用\<为开端,\>到最后匹配:

$ printf 'foo bar\nfoo.bar\nfoobar\nfoo_bar\nfoo\n' | grep 'foo\>' 
foo bar 
foo.bar 
foo 

_是如何匹配的词字符 - 但除此之外,WORDCHARS仅仅是alphanume rics,[a-zA-Z0-9]
另请注意foo行尾是如何匹配的 - 仅包含foo。行结束时我们不需要特殊情况。

+0

我想说这与我正在寻找的解决方案非常相似。你能给我一个例子,用'\>'来匹配单词的结尾吗? – shadox 2014-10-22 09:38:32

+0

我已经更新了答案,并显示了词边界匹配。 – 2014-10-22 10:14:49

你需要在你的正则表达式中转义.。此正则表达式将匹配任何以.pdf(即以.pdf结束,唯一的事情)结束:

.*\.pdf$ 
+0

OP想要匹配以.pdf结尾的行 – celeritas 2014-10-22 15:58:44

积极的lookaheads是最适合这种东西。有一个尝试:

grep -P "(^\w+\.pdf)(?=\s)" file 

我假设文件名将始终在行的开始。

+0

我试过这个,但它不起作用。它可能在其他环境中工作正则表达式,但它不适合** grep **我认为。它只是不匹配任何东西。 – shadox 2014-10-22 09:35:04