我正在使用grep在某个目录中找到一个单词:
grep -r my_word directory
在此目录中,包含my_word
的文件包含转义换行符(\n
),因此grep
的输出类似于:
file_name.txt:first line\n second line my_word\n third line
如何强制grep
将\n
视为新行并显示如下内容:
second line my_word
答案 0 :(得分:1)
您可以通过sed管道结果来转换换行符,然后再次grep:
grep -r my_word directory | sed 's/\\n/\n/g' | grep 'my_word'
或者,如果你的grep支持Perl兼容的正则表达式(例如GNU grep),你可以使用环视:
$ grep -Po '.*^|\\n\K.*my_word.*?(?=\\n|$)' myfile
second line my_word
这使用可变长度的后视.*^|\\n\K
来贪婪地删除截至搜索字词前一行\n
之前的所有内容,并.*?(?=\\n|$)
非贪婪地匹配线的其余部分,直到下一个\n
(或行尾)。
如果您不想在结果中使用文件名,以防匹配位于第一个“子线”,则可以使用grep -h
取消文件名。