我有大量文件,我想從所有這些文件中替換一些行。我不知道線條的確切內容,我所知道的全部都包含兩個已知的單詞 - 比如說'程序員'和'鮑勃'。所以我想,以取代線可能是這樣的:從多個文件中替換一行,限制爲行號範圍
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)標誌,該命令跳過了二進制文件。)
我一定發生了可怕的有隧道視野,因爲這個答案似乎完全合理,但由於某種原因,我真不敢弄明白了。也許我需要休息一下。 :)我會嘗試它,並標記爲正確的,如果它的工作。謝謝! –