簡體   English   中英

如何在整個系統中進行查找和替換?

[英]How can I do a find-and-replace across my whole system?

我想要運行一個查詢或腳本,該查詢或腳本首先在系統上的每個.php文件中搜索字符串strawberry 如果在任何地方都可以找到該字符串,則應將包含該字符串的整個行替換為pineapple字符串。 我只能訪問bash,沒有Ruby / Python /更靈活的語言。

我敢肯定有辦法做到這一點,但我想不通。 我什至無法找出啟動它的grep命令... grep -Rl "strawberry" . 似乎會返回目錄中的每個文件,甚至根本不包含字符串“ strawberry”的文件。

您並不是真的想要,而且可能到處都沒有寫權限。

find / -type f -name '*.php' -exec sed -i 's/.*strawberry.*/pineapple/' {} \;

如果您要清除惡意軟件感染或入侵,則正確的方法是使您的網站離線,修復攻擊媒介,加固系統,審核腳本以及從已知的其他文件中還原其余內容。良好的備份

這個怎么樣?

grep -RlZ "strawberry" /srv/www | 
    grep -z '.*\.php$' |
    xargs -r -0 sed -i 's|.*strawberry.*|pineapple|'

為了稍微說明一下,使用以下選項調用管道的第一個grep(1)調用:

  • -R :在所有符號鏈接之后,遞歸目錄。 注意與-r的區別。
  • -l :輸出任何匹配的文件名。
  • -Z :后綴為零的所有輸出文件名。 這用於確保正確處理帶有空格等的名稱。
  • /srv/www是您要搜索的目錄層次結構頂部的路徑。 您應該避免在這里使用/ -您可能不想這樣做, 尤其是在使用root特權進行此操作的情況下。

第二個grep過濾掉所有非PHP文件。 -z選項指示它使用零字節作為行(即文件名)分隔符,而不是換行符。

最后一部分使用xargs(1)執行sed(1)

  • 如果沒有找到匹配的文件,則xargs-r選項僅抑制錯誤。
  • xargs-0選項使它知道輸入項之間用零字節分隔。
  • sed-i選項指示它執行對匹配文件的就地替換。
  • 最后替換表達式s|.*strawberry.*|pineapple| 譯為“任何字符串,然后是草莓 ,然后是任何字符串,都應替換為菠蘿 ”。

但是,這不是執行此搜索的最有效方法-第一個grep將愉快地搜索每個文件,而不僅僅是PHP文件。 一種更有效的方法是使用find(1)預先過濾文件名:

find -L /srv/www -type f -name '*.php' -print0 |
    xargs -r -0 grep -lZ "strawberry" |
    xargs -r -0 sed -i 's|.*strawberry.*|pineapple|'

請注意xargs / grep部分-它用於防止包含搜索字符串的文件通過sed進行過濾,因為這至少會更改其修改時間並可能導致其他問題。 作為原則, 發出遞歸命令時 ,請始終盡可能具體 ...

我把其余的解釋留給讀者練習:-)

如果您使用gawk版本4.1 ,你可以使用inplace擴展bashglobstar選項來進行遞歸搜索。

shopt -s globstar
gawk -i inplace '/strawberry/{$0="pineapple"}1' /dir/**

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM