2013-04-15 31 views
5

在我的具體情況中,我需要遍歷數百個包含存儲URL的變量的文件。所有網址都不同,但對於這個例子來說,我們可以假設他們與「COM「」如何使用sed替換僅包含其他模式的文件中的文件中的模式

我需要添加一些文字全部結束立即COM以下

因爲所有的URL都會有不同的領域,我不能用一個sed命令,如:

sed -i 's/^ENVIRONMENT="someurl.com"/ENVIRONMENT="someurl.com.origin.net"/g'

因爲這些文件包含其中可能包含COM其他行,我不能使用類似:

sed -i 's/com/com.origin.net/g'

我需要做的這個搜索和特定的某一行包含一個模式,比如從我下面的例子在正則表達式只能更換:

^ENVIRONMENT.*

如果我只能將sed的使用集中到與上述模式匹配的行上,那麼我可以使用sed的一些適配,例如sed -i 's/com/com.origin.net/g'。我當然可以編寫一個過分複雜的bash腳本來做到這一點,但我知道有一個很好的方法可以告訴sed查找模式,只在模式找到的行上工作,然後搜索並替換另一個模式用一個新的字符串。

在谷歌搜索,只有半相關的鏈接,我發現這個是:

https://unix.stackexchange.com/questions/37518/how-to-sed-only-that-lines-that-contains-given-string

,但它沒有充分回答我的問題。同樣能夠將sed限制在一般情況下,只需一條匹配模式的線就可以通過一個很好的工具添加到我的sed arsenal中。

任何幫助,這將導致解決方案在這裏將不勝感激。

這裏是

### Example File
#
#
# someurl.com

ENVIRONMENT="someurl.com"

我想要替換「環境=「someurl一個文件的一個例子.COM「」與‘環境=‘someurl.com.orign.net’’

我可能會從插入此信息在一條線殼腳本衍生sed命令如:

`對於f在* .config中;做File2BeEdited = $(cat $ f | grep^PatternToIdentifyLine | grep -v RemoveLinesThatAreAlreadyCorrect); if [「$ File2BeEdited」!=「」];然後RunSedCommand; printf「\ n找到需要編輯的文件。\ N運行的sed在$ F >> log.log「;做

,所以我可以遍歷目錄中的每個配置文件,並選擇性地使這種變化

回答

9

以下命令行顯示了兩種可能的解決方案:你可以限制更換某些行與/regex/。你可以替換與\0\1使用匹配的文本等

sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/' 
+0

感謝這正是我想要完成的。尤其是能夠插入匹配的文本。只是爲了澄清我對您提供的答案的匹配文本替換方面的理解;我能用\ 0完成什麼?另外,如果我使用\ 2例如,這個插入是否會說來自正則表達式的第二個匹配文本。例如,如果我正在搜索有2種模式匹配的行。 – Matthew

+1

看看進GNU sed的手冊:在正則表達式反向引用](http://www.gnu.org/software/sed/manual/sed.html#index-Backreferences_002c-in-regular-expressions-103) – nosid

+0

你正在使用什麼'sed'調用地址? – Geremia

-2

你可以用gvim的做到這一點..

:g/^ baz/s/foo/bar/g

解釋:在所有以baz開頭的行中,用bar替換所有出現的foo。

檢查 http://vim.wikia.com/wiki/Search_and_replace 瞭解更多詳情..

+2

OP要求'sed'中的解決方案;這不是sed。 –

相關問題