Text-Processing
刪除不同文件中包含指定字元串的行
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/
要編輯文件並刪除包含字元串的行,有很多選項,但這裡有兩個常見的選項。由於您想在整條線上進行操作,這真的很容易 :)
首先,您可以使用
grep
with-v
參數來反轉搜尋並從輸出中隱藏匹配的行而不是顯示它們。對於您的第一個文件,讓我們使用sponge
. 這將允許我們讀取您的文件,對其進行過濾,然後將其寫回同一個文件中:grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php
對於您的第二個範例,我們將對 做同樣的事情
grep
,但如果您沒有,sponge
您可以將其寫入不同的文件,然後將該文件移回原始名稱:grep -v "gdfhu98324STRING" bar.php > bar.php.cleaned mv bar.php{.cleaned,}
第二種方法是使用
sed
lined
delete 命令。對於您的第一個範例,我們將使用就地文件編輯和創建.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
文件並使其始終可用。