Text-Processing

刪除不同文件中包含指定字元串的行

  • April 17, 2016

web/假設在namedfoo.php和中有兩個文件bar.php。第 1 行foo.php是“sdajgeSTRINGdsad”,第 10 行bar.php是“gdfhu98324STRING”。任務是首先找到這兩個文件,然後刪除 foo.php 的第 1 行和 bar.php 的第 10 行,因為指定的字元串是“STRING”。

sed可以這樣做:

sed -i.bak '/STRING/d' web/*

要查找包含字元串的文件,請使用grep. 如果要查找包含 STRING 的文件web/及其所有子目錄:

grep -R “字元串” web/

要編輯文件並刪除包含字元串的行,有很多選項,但這裡有兩個常見的選項。由於您想在整條線上進行操作,這真的很容易 :)

首先,您可以使用grepwith-v參數來反轉搜尋並從輸出中隱藏匹配的行而不是顯示它們。對於您的第一個文件,讓我們使用sponge. 這將允許我們讀取您的文件,對其進行過濾,然後將其寫回同一個文件中:

grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php

對於您的第二個範例,我們將對 做同樣的事情grep,但如果您沒有,sponge您可以將其寫入不同的文件,然後將該文件移回原始名稱:

grep -v "gdfhu98324STRING" bar.php  > bar.php.cleaned
mv bar.php{.cleaned,}

第二種方法是使用sedline ddelete 命令。對於您的第一個範例,我們將使用就地文件編輯和創建.bk備份文件的選項:

sed -i.bk '/sdajgeSTRINGdsad/d'  foo.php

幾乎相同的事情可以通過自己複製文件然後使用 sed 過濾備份並覆蓋原始文件來完成:

cp bar.php bar.php.bk
sed '/gdfhu98324STRING/d' bar.php.bk > bar.php

現在把這兩個任務結合起來!讓我們創建一個函式,以便您可以使用不同的字元串重複執行此操作:

function nuke_string () {
   string="$1"
   path="$2"
   grep -R -l "$string" "$path" | while IFS= read -r file; do
       sed -i.bk "/$string/d" "$file"
   done
}

創建該函式後,您可以像這樣使用它:

nuke_string "STRING" web/

任何在 web/ 中包含 STRING 的文件都將刪除這些行,並且將使用原始版本製作備份副本。您可以在目前的 shell 中創建這樣的函式,也可以將其寫入.bashrc文件並使其始終可用。

引用自:https://unix.stackexchange.com/questions/17520