是否有一种方法使grep从匹配搜索表达式的文件中输出“单词”?
如果我想在一些文件中找到“th”的所有实例,我可以这样做:
grep "th" *
但是输出会是这样的(粗体是我的);
some-text-file : the cat sat on the mat
some-other-text-file : the quick brown fox
yet-another-text-file : i hope this explains it thoroughly
我想让它输出什么,使用相同的搜索,是:
the
the
the
this
thoroughly
这可能使用grep吗?或者使用另一种工具组合?
我对awk难以记忆的语法不满意,但我喜欢用一个实用程序来做这件事的想法。
似乎ack(或者ack-grep如果你使用Ubuntu)可以很容易地做到这一点:
# ack-grep -ho "\bth.*?\b" *
the
the
the
this
thoroughly
如果你省略-h标志,你会得到:
# ack-grep -o "\bth.*?\b" *
some-other-text-file
1:the
some-text-file
1:the
the
yet-another-text-file
1:this
thoroughly
作为奖励,你可以使用——output标志来完成更复杂的搜索,使用我发现的最简单的语法:
# echo "bug: 1, id: 5, time: 12/27/2010" > test-file
# ack-grep -ho "bug: (\d*), id: (\d*), time: (.*)" --output '$1, $2, $3' test-file
1, 5, 12/27/2010
交叉分发安全答案(含windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
如果你使用的是不包含-o选项的旧版本的grep(如2.4.2),那么使用上面的方法。否则使用下面的简单版本来维护。
Linux交叉分发安全答案
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
总结一下:-oh输出正则表达式匹配到文件内容(而不是文件名),就像你期望正则表达式在vim/etc中工作一样…然后,您将搜索什么单词或正则表达式,这取决于您!只要你继续使用POSIX而不是perl语法(请参阅下文)
更多内容来自grep手册
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
为什么最初的答案并不适用于所有人
\w的用法因平台而异,因为它是一种扩展的“perl”语法。因此,那些局限于POSIX字符类的grep安装使用[[:alpha:]],而不是perl中的\w。有关正则表达式的更多信息,请参见维基百科页面
最终,上面的POSIX答案将更加可靠,不管grep使用的是什么平台(是原始平台)
对于不带-o选项的grep的支持,第一个grep输出相关的行,tr将空格分割为新行,最后一个grep只过滤相应的行。
(PS:我知道现在大多数平台都已经为\w....打了补丁但总有落后的)
感谢@AdamRosenfield回答中的“-o”