Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 文件名中带有空格的grep文件_Regex_Bash_Grep - Fatal编程技术网

Regex 文件名中带有空格的grep文件

Regex 文件名中带有空格的grep文件,regex,bash,grep,Regex,Bash,Grep,我有一个包含文件名的列表。某些文件名包含空格: ./folder/folder/some file name.ext grep ./folder/folder/some: No such file or directory grep file: No such file or directory grep name: No such file or directory 我需要对每个文件进行grep: cat filelist | while read i; do grep "pattern"

我有一个包含文件名的列表。某些文件名包含空格:

./folder/folder/some file name.ext
grep ./folder/folder/some: No such file or directory
grep file: No such file or directory
grep name: No such file or directory
我需要对每个文件进行grep:

cat filelist | while read i; do grep "pattern" $i; done
显然,grep会因为空格而失败:

./folder/folder/some file name.ext
grep ./folder/folder/some: No such file or directory
grep file: No such file or directory
grep name: No such file or directory
我试图避开空白,比如:

:%s/some file name/some\ file\ name/g
但是没有运气。 我怎样做手术? 谢谢

您可以使用此循环:

while read -r i; do grep "pattern" "$i"; done < filelist
读取时-ri;执行grep“模式”$i;完成<文件列表

使用带有
cat
的管道容易出错,BASH会将带有空格的字符串作为单独的参数处理。

如果使用
xargs
,则更简单:

xargs -d '\n' -- grep pattern -- < filelist
您还可以使用
readarray

readarray -t files < filelist
for f in "${files[@]}"; do grep pattern -- "$f"; done
您可以通过流程替换直接执行以下操作:

readarray -t files < <(exec sed -e 's|\r||' filelist)
xargs -d '\n' -- grep pattern -- < <(exec sed -e 's|\r||' filelist)
readarray-t文件$i

cat filelist | while read i; do grep "pattern" "$i"; done
简单有效:

var=$(awk '{ print "\""$0"\""}' filelist)
command="grep \"pattern\" $var"
eval $command
或者,如果您希望将其作为一行:

command="grep -ir \"pattern\" $(awk '{ print "\""$0"\""}' <<< "$(ls)")"; eval $command

command=“grep-ir\”pattern\“$(awk'{print“\”“$0”\”“}您可以使用
\s
来代替吗?我认为使用
cat
的可能重复不是问题。问题本身实际上是
$I
没有被
引用"
导致它进行分词。两者之间有什么区别?@TomFenech前者严格遵循每个实例处理一个文件的方法。
xargs
模式比
while
模式对于
循环要有效得多。想象一下,你正在浏览一个百万个文件列表,每个文件都是如此le文件将使用while/for循环打开、读取和关闭。我花了几个小时的时间浏览了列表的10%甚至更少。使用
xargs
我在几分钟内获得了更多。@kK Storm每个文件仍将使用xargs打开。唯一的区别(显著)除非添加
-n1
,否则执行的grep实例更少。
command="grep -ir \"pattern\" $(awk '{ print "\""$0"\""}' <<< "$(ls)")"; eval $command