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

hdf*_*hdf 2 regex bash grep

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

./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)

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

anu*_*ava 6

你可以使用这个循环:

while read -r i; do grep "pattern" "$i"; done < filelist
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为使用`cat`不是问题.问题本身实际上是`$ i`没有引用``"`导致它有单词分裂. (3认同)
  • 啊,谢谢@konsolebox,这一定是罪魁祸首. (2认同)

kon*_*box 5

如果您使用更简单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)