如何对具有空格的 grep 输出执行 xargs grep?

qua*_*cle 8 shell grep find xargs quoting

我正在根据正则表达式搜索文件,然后我试图在这些文件中搜索内容。所以,例如,我有类似的东西

#Find all C++ files that match a certain pattern and then search them
find . -name "*.cpp" | grep "<name regex>" | xargs grep "<content regex>"
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是某些路径中有空格,这让xargs. 我知道如果我只是使用find,我可以使用-print0参数(以及-0参数xargs)来防止 xargs 将空格视为分隔符。有类似的东西grep吗?

还是我完全以错误的方式处理这个问题?天真地,findtogrepxargs grep我来说很有意义,但我对产生相同结果的其他方法持开放态度。

Zor*_*che 5

也许使用这样的东西(如果 gnu grep)。

grep -r 'content pattern' --include==*.cpp
Run Code Online (Sandbox Code Playgroud)

男人 grep

--include=GLOB 仅搜索基本名称与 GLOB 匹配的文件(使用 --exclude 中所述的通配符匹配)

另请参阅空分隔符的选项。

-Z, --null 输出一个零字节(ASCII NUL 字符)而不是通常跟在文件名后面的字符。例如,grep -lZ 在每个文件名后输出一个零字节,而不是通常的换行符。此选项使输出明确,即使文件名包含不寻常的字符(如换行符)也是如此。此选项可与 find -print0、perl -0、sort -z 和 xargs -0 等命令一起使用,以处理任意文件名,甚至包含换行符的文件名。

-z, --null-data 将输入视为一组行,每行以零字节(ASCII NUL 字符)而不是换行符结尾。与 -Z 或 --null 选项一样,此选项可与 sort -z 等命令一起使用以处理任意文件名。


Baa*_*gar 5

如果你必须跳过很多圈子,那么 xargs 的效率无论如何都会损失。这是一种粗略的解决方法:

find . -iname "*.cpp" | grep "<pattern>" | while read -r x; do grep exa "$x"; done
Run Code Online (Sandbox Code Playgroud)

每次我遇到文件名中的空格问题时,答案都是变量上的双引号。