![](/img/trans.png)
[英]Search for lines with specific text in files and output file names (file command and grep)
[英]How to delete lines with specific text in multiple files and get output with grep
我試圖刪除目錄中50個文件中所有包含“ Cl”的行:並將修改后的文件發送到子目錄no_cl中
grep -vE "Cl" *.pdb > no_cl/$*.pdb
但是,這不起作用,
如何在此語句中使用通配符?
find -name "*.pdb" -type f -print0 | xargs -t -n1 -0 -I % sh -c 'grep -vE Cl % > no_cl/%'
討論:
您可以根據外殼使用shell循環,但是使用find
和xargs
可以將文件列表從標准輸入轉換為多個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執行的每個命令。
如果任何文件名中有空格,則會中斷。 等等,請閱讀此內容以進行更多的“不要使用ls”討論 。
或者: 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
期望它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.