假設我有一個文件,這個模式:我可以用多模式匹配的sed
<directory number=133 name=var1>
<myfile name=test1 />
</directory>
現在我想更換圖案
<directory number=133 myfile=test1 />
我怎樣才能做到這一點與sed
?
假設我有一個文件,這個模式:我可以用多模式匹配的sed
<directory number=133 name=var1>
<myfile name=test1 />
</directory>
現在我想更換圖案
<directory number=133 myfile=test1 />
我怎樣才能做到這一點與sed
?
桑達不利於多行的東西,但是:
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
你能告訴我那裏發生了什麼 – user175386049
我還沒有理解這個':l; N; $!tl; N;'cab你把它們放在單獨的行裏解釋每個的用法。我的意思是'N',$,!,tl,N – user175386049
更新了更多的信息 – perreal
這上面的圖案是可變的,並且是固定的?根據猜測,''標籤中'number'的值和'name'的值是可變的,需要複製。如果它全部修復,那麼處理起來就容易多了。 –