2013-01-07 23 views
1

假設我有一個文件,這個模式:我可以用多模式匹配的sed

<directory number=133 name=var1> 
<myfile name=test1 /> 
</directory> 

現在我想更換圖案

<directory number=133 myfile=test1 /> 

我怎樣才能做到這一點與sed

+0

這上面的圖案是可變的,並且是固定的?根據猜測,''標籤中'number'的值和'name'的值是可變的,需要複製。如果它全部修復,那麼處理起來就容易多了。 –

回答

2

桑達不利於多行的東西,但是:

sed ':l;N;$!tl;N;s!<directory number=133 name=var1>[ ]*\n<myfile name=test1 />[ ]*\n</directory>!<directory numbe=133 myfile=test1 />!' input 

這個命令首先讀取所有在一個循環的文件:

:l;N;$!tl;N; # label l, read line, while not eof jump to label l 

哪裏:l是標籤。 N是讀取的下一行並將其附加到緩衝區命令。 $!測試是否(!)文件結尾($)。 t是最後一次測試成功命令的分支。 t後面跟着標籤名稱來分支,因此tl。在繼續之前,最後的N將最後一行追加到緩衝區。

然後基本上匹配問題中的輸入並使用替代(s!regex!replace!)命令將其替換爲期望的輸出。

如果你也想捕獲所有不同的號碼和姓名:

sed ':l;N;$!tl;N;s!<directory number=\([0-9]*\) name=\([^>]*\)>[ ]*\n<myfile name=test1 />[ ]*\n</directory>!<directory number=\1 myfile=\2 />!' input 
+0

你能告訴我那裏發生了什麼 – user175386049

+0

我還沒有理解這個':l; N; $!tl; N;'cab你把它們放在單獨的行裏解釋每個的用法。我的意思是'N',$,!,tl,N – user175386049

+0

更新了更多的信息 – perreal