![](/img/trans.png)
[英]How can I use regex find-and-replace to insert missing spaces before curly braces?
[英]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
的-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
擴展與bash
的globstar
選項來進行遞歸搜索。
shopt -s globstar
gawk -i inplace '/strawberry/{$0="pineapple"}1' /dir/**
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.