以下是一个简单的Bash命令行:
grep -li 'regex' "filename with spaces" "filename"
Run Code Online (Sandbox Code Playgroud)
没问题.以下工作也很好:
grep -li 'regex' $(<listOfFiles.txt)
Run Code Online (Sandbox Code Playgroud)
其中listOfFiles.txt包含要grepped的文件名列表,每行一个文件名.
listOfFiles.txt包含带有嵌入空格的文件名时会出现此问题.在我试过(见下文),所有的情况下,击分裂的空间,以便文件名,例如,在一行listOfFiles.txt
包含类似名称./this is a file.xml最终设法在每一片上运行的grep( ,,./this 和).isafile.xml
我以为我是一个相对先进的Bash用户,但我找不到一个简单的魔术咒语来让这个工作.这是我尝试过的东西.
grep -li 'regex' `cat listOfFiles.txt`
Run Code Online (Sandbox Code Playgroud)
如上所述失败(我真的没想到这会起作用),所以我想我会在每个文件名周围加上引号:
grep -li 'regex' `sed -e 's/.*/"&"/' listOfFiles.txt`
Run Code Online (Sandbox Code Playgroud)
Bash将引号解释为文件名的一部分,并为每个文件提供"No such file or directory"(并且仍然使用空格分割文件名)
for i in $(<listOfFiles.txt); do grep -li 'regex' "$i"; done
Run Code Online (Sandbox Code Playgroud)
这未按原始的尝试(也就是说,它的行为就好像引号被忽略),是非常缓慢的,因为它必须每个文件启动一个"grep"可以替代过程在处理一个调用的所有文件.
以下工作,但如果正则表达式包含shell元字符,则需要一些小心的双重转义:
eval grep -li 'regex' `sed -e 's/.*/"&"/' listOfFiles.txt`
Run Code Online (Sandbox Code Playgroud)
这是构造命令行的唯一方法,以便正确处理带空格的文件名吗?