以特定字符结尾的字符串的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
。行结束时我们不需要特殊情况。
你需要在你的正则表达式中转义.
。此正则表达式将匹配任何以.pdf(即以.pdf结束,唯一的事情)结束:
.*\.pdf$
OP想要匹配以.pdf结尾的行 – celeritas 2014-10-22 15:58:44
积极的lookaheads是最适合这种东西。有一个尝试:
grep -P "(^\w+\.pdf)(?=\s)" file
我假设文件名将始终在行的开始。
我试过这个,但它不起作用。它可能在其他环境中工作正则表达式,但它不适合** grep **我认为。它只是不匹配任何东西。 – shadox 2014-10-22 09:35:04
我想说这与我正在寻找的解决方案非常相似。你能给我一个例子,用'\>'来匹配单词的结尾吗? – shadox 2014-10-22 09:38:32
我已经更新了答案,并显示了词边界匹配。 – 2014-10-22 10:14:49