我有一个包含文件名的列表.一些文件名包含空格:
./folder/folder/some file name.ext
Run Code Online (Sandbox Code Playgroud)
我需要grep这些文件:
cat filelist | while read i; do grep "pattern" $i; done
Run Code Online (Sandbox Code Playgroud)
显然grep由于空格而失败:
grep ./folder/folder/some: No such file or directory
grep file: No such file or directory
grep name: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我试图逃脱这样的空白:
:%s/some file name/some\ file\ name/g
Run Code Online (Sandbox Code Playgroud)
但没有运气.我该如何进行手术?谢谢!
你可以使用这个循环:
while read -r i; do grep "pattern" "$i"; done < filelist
Run Code Online (Sandbox Code Playgroud)
使用管道cat容易出错,BASH会将带空格的字符串视为单独的参数.
如果您使用更简单xargs:
xargs -d '\n' -- grep pattern -- < filelist
Run Code Online (Sandbox Code Playgroud)
如果您确实需要每个 实例只处理 1 个文件grep,请添加-n 1:
xargs -n 1 -d '\n' -- grep pattern -- < filelist
Run Code Online (Sandbox Code Playgroud)
您还可以使用readarray:
readarray -t files < filelist
for f in "${files[@]}"; do grep pattern -- "$f"; done
Run Code Online (Sandbox Code Playgroud)
或者干脆
readarray -t files < filelist
grep pattern -- "${files[@]}"
Run Code Online (Sandbox Code Playgroud)
并确保文件为 UNIX 格式:
sed -i 's|\r||' filelist ## Or
dos2unix filelist
Run Code Online (Sandbox Code Playgroud)
您可以直接使用流程替换来完成:
readarray -t files < <(exec sed -e 's|\r||' filelist)
xargs -d '\n' -- grep pattern -- < <(exec sed -e 's|\r||' filelist)
Run Code Online (Sandbox Code Playgroud)