2016-02-13 147 views
0

我想直到沒有在文中,可用火柴此搜索重複:Perl的一個班輪重複替代

perl -pi -e 's/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/\1<tig>\2<\/tig>\1<tig>/g' iate.dsl 

基本上,我需要一個while循環中的一個班輪的形式,這將需要看起來有點像這樣

<langSet...><tig>...</tig><tig>...</tig><tig>...</tig><tig>...</tig> 

,並返回這樣的事情

<langSet...><tig>...</tig><langSet...><tig>...</tig><langSet...><tig>...</tig><langSet...><tig>...</tig> 

線,其中的01號實例因行而異。

+4

嗯哦。你確定你不想要一個正確的XML解析器來重寫你的文檔嗎?使用正則表達式會要求災難。 – tadman

+0

那麼,我已經知道一些關於正則表達式的東西,而對XML解析器一無所知,所以... – jennie

+3

認真...... @tadman說的。沒有不知道的恥辱,但是在「正確工作的正確工具」這個範疇內,檢查它是非常值得的。 – Hambone

回答

0

這工作:

perl -p -i -e 's/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/\1<tig>\2<\/tig>\1<tig>/g while m/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/gi' iate.dsl 
0

第一個這不是一個「搜索」,這是一個「替代」,第二個想法是,你不需要一個while循環,導致'perl one liner'讀出每一行。

但是,如果m/foo/i'或類似的想法,你可以使用「if語句」 - >'s/foo/bar/i,就像ternare if-then-else一樣,但這不是必須的。我先用「-i」(不是「-pi」)標誌「-p」來檢查,首先檢查輸出。

例如:

perl -p -e 's/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig>\s*<tig>/\1<tig> 
\2<\/tig>\1<tig>/g if m/(<langSet xml.lang=....>)\s*<tig>(.*?)<\/tig> 
\s*<tig>/gi' iate.dsl 

好運。

+0

我用你的解決方案,但用「while」而不是「if」,它的工作原理。 (「if」語句只會替換一次 – jennie

+0

嗨,我相信實際上「if」或「while」語句在你的情況下是多餘的,也許它對於更多的行有更好的性能是有用的。做一些沒有這些語句的檢查,可能與以前相同的結果,導致你的單行語句已經是一個循環拋出每一行,實際上正則表達式決定你是否替換每一個「匹配」或只是其中之一,等等但主要的想法是,它有效,乾杯。 –