如何删除多个文件中具有特定文本的行,并使用grep获取输出

时间:2017-08-08 13:54:13

标签: shell grep

我正在尝试删除包含" Cl"的所有行。在目录中的50个文件中: 并将修改后的文件发送到子目录no_cl

grep -vE "Cl" *.pdb > no_cl/$*.pdb

然而,这不起作用,

如何在此语句中使用通配符?

1 个答案:

答案 0 :(得分:0)

<强> find -name "*.pdb" -type f -print0 | xargs -t -n1 -0 -I % sh -c 'grep -vE Cl % > no_cl/%'

讨论:

您可以根据shell使用shell循环,但使用findxargs,您可以将标准输入的文件列表转换为多个grep调用。

/bin/ls *.pdb | xargs -t -n 1 -I % sh -c 'grep -vE Cl % > no_cl/%'

使用/bin/ls(防止使用ls的任何别名)获取*.pdb,使用xargs管道转移-n 1将每个输入令牌转换为命令。 -I %告诉xargs用输入标记替换%。然后使用Xargs执行sh -c 'grep -vE Cl % > no_cl/%-t回显xargs执行的每个命令。

如果任何文件名中包含空格,则会中断。等等read this for more "don't use ls" discussion

或者:find -name "*.pdb" -type f -exec sh -c 'grep -vE Cl < "{}" > "no_cl/{}"' \; ...也可能与空间打破。 find -exec语法很奇怪。

所以,两全其美。使用find表示空终止文件列表,使用xargs执行grep每个文件:

<强> find -name "*.pdb" -type f -print0 | xargs -t -n1 -0 -I % sh -c 'grep -vE Cl % > no_cl/%'

-print0告诉find使用空终止,-0告诉xargs期望它。