我有一个包含文件名的列表。一些文件名包含空格:
./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
但没有运气。 我该如何进行手术? 谢谢!
答案 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