2012-04-04 44 views
0
刪除

我的情況是:Linux的牛瘟/ SED [xargs的]尋找模式和行號,並與SED

  1. 我有一個很長的文本字符串,包含特殊字符,它發生在一個長行在各種文件中。包含字符串的文件遍佈整個文件系統(Linux)。該字符串可能位於文件所在文件中的各種行號上,但每個文件只會出現一次。然而,字符串包含一個特定的模式,我可以鍵入識別整個字符串。

  2. 我知道如何通過使用GREP -lir mystringprefix/path鍵入字符串的「前綴」來找到包含該字符串的文件的名稱。

  3. 我知道如何使用grep -n「prefix」來確定文件中使用GREP和SED的字符串的行號file.name | sed -n「s/^([0-9] )[:]。/\ 1/p「。

  4. 我知道如何使用SED在文件中刪除包含感興趣的字符串的行,使用sed -i xd/path/file(x是要刪除的行號)。

我的問題是怎樣才能把所有這些組合起來,以確定哪些文件包含的模式,通過名稱來grep來確定文件中的行號,然後同時通過名稱和行號sed來刪除線?

我需要這樣做,以便在文件系統中的某個位置啓動,然後遞歸搜索/刪除。

謝謝。

回答

2

很簡單:

for file in "$(grep -lir 'prefix' /path/)" ; do 
    sed -ibk -e '/prefix/d' "$file" 
done 

如果我們假設grep -lir prefix /path/返回的文件名換行分隔的列表,並且您的前綴模式也未嘗sed就明白了。

我不需要在這裏確定行號,因爲我告訴sed找到匹配prefix的行並直接刪除它們。然而,for file in "$(grep ...)"構造有點不安全,因爲攻擊者可能製作一個文件名,這會導致它做一些你不期望的事情。這將是更好地說:

grep -lir 'prefix' /path/ --null | while IFS= read -r -d '' file ; do 
    sed -ibk -e '/prefix/d' "$file" 
done 

雖然注意到,在while循環體賦值的變量將無法生存了。

+0

我無法找到該名男子頁k的SED命令行開關。這個開關做什麼? (你的回答也表明我可以通過使用GREP -lirZ來執行\ 0)。 – GWild 2012-04-04 12:05:57

+1

@GWild:'-ibk'就像'-i bk',它指定修改時創建備份文件時使用的後綴。我想用'-i.bak'會讓這個更明顯 – Sorpigal 2012-04-04 12:28:39

+0

不幸的是,這兩個例子都不適用於我的情況。我不斷收到SED錯誤「無法找到跳轉標籤」,它引用了我的模式字符串。我很欣賞嘗試的援助。無論出於何種原因,SED對簡單文本都感到窒息。去爲什麼我最初想要的行號,並能夠通過它。 GREP找到沒有問題的字符串。 – GWild 2012-04-05 00:28:10

0

模式爲區分大小寫

grep -Zlr 'mystringprefix' /path/ | xargs -0 sed -i '/mystringprefix/d'