2013-10-25 46 views
1

我是指令的初學者,使用Linux。現在我有一個行的文件中:sed:如何替換具有可變字符的行?

exten => *97,ttttt 

而且我想,以取代該行的兩行:

exten => *97,aaaaa 
exten => *97,bbbbb 

如果原文是靜態的,我可以這樣寫命令更換行:

sed -e 's/,ttttt/,aaaaa\nexten => *97,bbbbb/' -i xxxx.txt 

但不知何故,該文件xxxx.txt由腳本生成,因此*97可能成爲*95或其他東西,所以接下來的時間xxxx.txt可能是這樣的:

exten => *95,ttttt 

而且我有這兩條線來代替它這個時間:

exten => *95,aaaaa 
exten => *95,bbbbb 

在這種情況下,我不能執行sed以上命令cuz它會寫*97到第二線。

有沒有辦法讓我每次都不需要改寫sed命令,而且還可以正確地完成這項工作?

回答

2

試圖保存所有的數據,直到在第1組的數量和第2組的數量,然後用後他們不同的字符串和它們之間的換行符替換過兩次:

sed -e 's/^\(.*\)\(\*[0-9]\+\).*$/\1\2,aaaaa\n\1\2,bbbbb/' infile 

它產生:

exten => *97,aaaaa 
exten => *97,bbbbb 
+0

問題已解決。謝謝。 –

+0

@JohnSmith:在模式部分,轉義圓括號內的第一個內容保存爲「group 1」,可以用'\ 1'表達式在替換部分恢復。下一個加括號的表達式將被保存爲「\ 2」,如果其中更多,則以此類推。您應該閱讀一些關於正則表達式或「sed」手冊的文章,因爲這是它最基本的知識。 – Birei

1

它要求一個sed解決方案,但它也可以與awk

echo "exten => *97,ttttt" | awk -F, '{print $1 ",aaaaa\n" $1 ",bbbbb"}' 
exten => *97,aaaaa 
exten => *97,bbbbb 
完成

這可能是一些更容易理解,通過使用-F,
然後打印第一個過去與aaaaa,和新的生產線比較複雜的語法sed
鴻溝串兩個部分再次\n
所以第一部分bbbbb

+0

非常感謝!這也解決了這個問題。 –