[英]Multiple lazy string replacing between two patterns with sed
例:
This (word1) is a test (word2) file.
我想要的是:
This is a test file.
問題是括號出現不止一次,所以如果我使用:
sed 's/<.*>//g'
我得到This file
,這是錯的。
如果我想在兩個相同的模式之間替換字符串怎么樣?
喜歡:
WORD1 %WORD2% WORD3 => WORD1 WORD3
你需要的只是一個否定的字符類[^<>]*
,它將匹配除<
/ >
任何字符:
sed 's/<[^<>]*>//g'
或者,如果你有圓括號,你可以使用[^()]*
(請注意,在BRE語法中,匹配文字(
或)
轉義\\
是不必要的):
sed 's/([^()]*)//g'
請參閱IDEONE演示
至於更新,您可以使用.*
刪除從WORD1
到WORD3
所有內容,但僅當只有一組WORD1
和WORD3
( 演示 )時:
echo "WORD1 %WORD2% WORD3" | sed 's/WORD1.*WORD3/WORD1 WORD3/g'
使用sed ,不可能使用lookarounds(這里是lookaheads),也不可能使用惰性量詞來限制匹配到最左邊的WORD3
次數。 如果您確定中間沒有%
符號,您仍然可以使用否定字符類方法( 演示 ):
echo "WORD1 %WORD2% WORD3" | sed 's/%[^%]*%//g'
通用的解決方案是通過幾個步驟完成:
<UC>
)替換起始和結束分隔符(我使用的是俄語字母,但它應該是一些控制字符) <UC1>[^<UC1><UC2>]*<UC2>
替換必要的替換字符串 這是一個例子 :
#!/bin/bash
echo "WORD1 %WORD2% WORD3 some text WORD1 %WORD2% WORD3" |
sed 's/WORD1/й/g' |
sed 's/WORD3/ч/g' |
sed 's/й[^йч]*ч/й ч/g' |
sed 's/й/WORD1/g' |
sed 's/ч/WORD3/g'
// => WORD1 WORD3 some text WORD1 WORD3
我正在硬編碼空間,但可以在必要時進行調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.