簡體   English   中英

用sed替換兩個模式之間的多個惰性字符串

[英]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演示

至於更新,您可以使用.*刪除從WORD1WORD3所有內容,但僅當只有一組WORD1WORD3演示 )時:

echo "WORD1 %WORD2% WORD3" | sed 's/WORD1.*WORD3/WORD1 WORD3/g'

使用 ,不可能使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM