2013-05-21 46 views
0

我有大量文件,我想從所有這些文件中替換一些行。我不知道線條的確切內容,我所知道的全部都包含兩個已知的單詞 - 比如說'程序員'和'鮑勃'。所以我想,以取代線可能是這樣的:從多個文件中替換一行,限制爲行號範圍

Created by Programmer Bob 
Programmer extraordinaire Bob, such an awesome guy 
Copyright programmer bob, all rights reserved 

到目前爲止,這聽起來很容易,但問題是,我只希望替換包含在線路範圍內的線 - 例如在開始該文件(通常可以找到關於該文件的評論)。我不能替換在文件的後面部分中找到的行,因爲我不想意外地替換實際的代碼。

到目前爲止,我曾嘗試:

find . -exec grep -il -E 'Programmer.*Bob' {} \; | xargs sed -i '1,10 /Programmer.*Bob/Ic\LINE REPLACED' 

(我用找到,因爲grep的跑進無限遞歸 - 我認爲不是問題的關鍵在這裏。)

但是似乎我能不使用c \(改變行)的地址範圍。隨意指出任何語法錯誤,但我想我已經嘗試了一切無濟於事。這確實沒有行號。

編輯: 我得到了答案,但我決定編輯我的問題,包括我的解決方案,擴大了我得到的答案 - 也許有人會發現這有幫助。

我後來意識到我想在行的開頭保留可能的空白和註釋字符。我使用這個命令完成它:

find . -exec grep -ilI '.*Programmer.*Bob.*' {} \; xargs sed -i -r '1,10 s/([ \t#*]*)(.*Programmer.*Bob.*)/\1LINE REPLACED/I' 

\ 1保持匹配[\ t#*] *的模式。人們可以將其更改爲^ [\ t#*] *,將錨定模式行的開始,但(我認爲)這個最新版本將改變

** Text I don't want to remove ** Programmer Bob 

** Text I don't want to remove ** LINE REPLACED 

其實可能會更好。 (我還在查找命令中添加了-I(大寫i)標誌,該​​命令跳過了二進制文件。)

回答

0

您在混合地址和命令。簡單的替換應該工作:

find . -exec grep -il -E 'Programmer.*Bob' {} \; \ 
    | xargs sed -i '1,10 s/.*Programmer.*Bob.*/LINE REPLACED/' 
+0

我一定發生了可怕的有隧道視野,因爲這個答案似乎完全合理,但由於某種原因,我真不敢弄明白了。也許我需要休息一下。 :)我會嘗試它,並標記爲正確的,如果它的工作。謝謝! –

0
find . -type f -name "*.cpp"|xargs perl -pi -e 'if(/Programmer/ && /Bob/ && $.>=1 && $.<10){$_="line to replace"}' 
0

sed命令:

>sed '1,10 {s/programmer\|bob/LINE REPLACED/i;s/programmer\|bob//ig}' file