2016-02-23 160 views
1

我一直在尋找sedawk。我還沒找到一個顯示使用文本文件(findtext.txt)來掃描所有* .php文件並刪除文本的示例。sed或awk使用文本文件替換文本

幾乎我有一塊文本,需要被刪除一堆的PHP文件。

我知道如何使用基本的sed命令這樣

sed -i 's/sometext/replacetext/g' *.php 

我想什麼做的是在findtext.txt sed的樣子搶文本塊,然後掃描* .PHP和移除文件中的文本塊。

+1

編輯您的問題以顯示簡明,可測試的示例輸入和預期輸出。無論你提出多少問題,你都會回答你的問題。 –

+0

您可以創建'findtext.txt',其中包含您的sed腳本,如's/sometext/replacetext/g',用replacetext替換某些文本。您可以根據需要放置儘可能多的'sed'腳本,包括刪除特定的行,如'1d'或'/ sometext /,/ anothertext/d'。然後使用'sed -i -f findtext.txt * .php'這樣的腳本。 – alvits

+0

如果你的意思是'刪除插入到我的網站的惡意代碼',那麼你現在就可以開始哭泣(對不起)。你可以在這裏搜索解決方案,但它們非常脆弱。祝你好運。 – shellter

回答

1

findtext.txt的內容分配給bash變量,並在sed替換中使用該變量。以下是一條線路解決方案。如果findtext.txt中有多行,我不確定它是否有效。

$ findtext=$(cat findtext.txt) && sed -i.bak -e "s/$findtext/bbbb/g" *.php 
+1

假設一個「文本塊」有多行(在我的書中是一個安全的假設),這並不能解決所謂的「有一段文本需要被刪除」的問題。祝你們好運。 – shellter

3

有兩個挑戰:

  • 使用存儲在作爲正則表達式參數seds///功能使用時,應視爲字面上一個變量或文件中的文本提出的挑戰必須在該文本中轉義正則表達式元字符。

  • 此外,由於你在談論一個塊文本中所儲存的文件findtext.txt,我假設你在談論一個直插式的解決方案 - 而sed是取向單線默認。

以下解決方案解決了兩個難題:

# Read the multiline search string into a variable 
# and quote it to ensure literal treatment when used as a regex. 
sometextQuoted=$(sed -e 's/[^^]/[&]/g; s/\^/\\^/g; $!a\'$'\n''\\n' < 'findtext.txt' | 
    tr -d '\n') 

# Now process the *.php files: 
# Read each file *as a whole* before performing the string replacement. 
sed ':a; $!{N;ba}; s/'"$sometextQuoted"'/replacetext/g' *.php 
  • 該解決方案是基於我的this answer,至極解釋用來引號(逃逸)的sed命令搜索文本(sometextQuoted=...)詳細。

  • ':a; $!{N;ba}是標準sed成語,它可以一次讀取整個文件。

  • 注意如何"$sometextQuoted"拼接成否則單引號sed腳本,以避免在什麼shell解釋了前面對什麼sed最終看到的混亂。

  • 請注意,如果你也想讀一個變量/文件中的更換文本(replacetext在你的例子),一個不同形式引用(轉義)將需要的 - 再次,看linked answer

注:第二sed命令要求GNUsed,我假設你正在使用(-i沒有參數不符合BSD/OSX sed工作);它可能,但更復雜,使這個工作與BSD/OSX sed
此外,我從命令中省略了-i,因此您可以先檢查結果而無需替換原始文件。