文件名中包含空格的grep文件

时间:2014-08-11 19:04:25

标签: regex bash grep

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

./folder/folder/some file name.ext

我需要grep每个文件:

cat filelist | while read i; do grep "pattern" $i; done

显然grep由于空格而失败:

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

但没有运气。 我该如何进行手术? 谢谢!

4 个答案:

答案 0 :(得分:6)

你可以使用这个循环:

while read -r i; do grep "pattern" "$i"; done < filelist

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

答案 1 :(得分:4)

如果您使用xargs更简单:

xargs -d '\n' -- grep pattern -- < filelist

如果您确实只需要为grep的每个实例处理一个文件,请添加-n 1

xargs -n 1 -d '\n' -- grep pattern -- < filelist

您还可以使用readarray

readarray -t files < filelist
for f in "${files[@]}"; do grep pattern -- "$f"; done

或者只是

readarray -t files < filelist
grep pattern -- "${files[@]}"

确保文件采用UNIX格式:

sed -i 's|\r||' filelist  ## Or
dos2unix filelist

您可以直接使用流程替换来执行此操作:

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

答案 2 :(得分:1)

引用$i

cat filelist | while read i; do grep "pattern" "$i"; done

答案 3 :(得分:0)

简单高效:

var=$(awk '{ print "\""$0"\""}' filelist)
command="grep \"pattern\" $var"
eval $command

或者如果您希望将其用作一体式衬纸:

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