簡體   English   中英

使用sed替換空格分隔的字符串

[英]Using sed to replace space delimited strings

echo 'bar=start "bar=second CONFIG="$CONFIG bar=s buz=zar bar=g bar=ggg bar=f bar=foo bar=zoo really?=yes bar=z bar=yes bar=y bar=one bar=o que=idn"' | sed -e 's/^\\|\\([ "]\\)bar=[^ ]*[ ]*/\\1/g'

實際輸出:

CONFIG="$CONFIG buz=zar bar=ggg bar=foo really?=yes bar=yes bar=one que=idn"

預期產量:

CONFIG="$CONFIG buz=zar really?=yes que=idn"

我的正則表達式中缺少什么?

編輯:

這可以按預期工作(使用GNU sed ):

's/\\(^\\|\\(['\\''" ]\\)\\)bar=[^ ]*/\\2/g; s/[ ][ ]\\+/ /g; s/[ ]*\\(['\\''"]\\+\\)[ ]*/\\1/g'

sed正則表達式非常有限。 例如,它們不包含\\ w作為[a-zA-Z0-9_]的同義詞。 它們也不包含\\ b,這意味着單詞開頭或結尾的零長度字符串(在這種情況下,您確實需要...)。

s/ bar=[^ ]* *//

距離很近,但是問題是結尾*刪除了下一個bar=之前的空格。 因此,在... bar=aaa bar=bbb ... ,第一個匹配項是bar=aaa離開bar=bbb ...嘗試第二個匹配項,但它不匹配,因為您已經消耗了bar之前的空間。

s/ bar=[^ ]*//

更好-不要占用尾隨空格,將它們留給下一場比賽使用。 如果您想匹配bar=something即使它在字符串的開頭,請在開頭的開頭插入一個空格:

sed 's/^bar=/ bar=/; s/ bar=[^ ]*//'

如果要刪除bar=something所有實例,則可以這樣簡化正則表達式:

\\sbar=\\w+

這匹配所有bar=加上所有整個單詞。 必須在bar=之前加一個空格字符。

示范: https : //regex101.com/r/xbBhJZ/3

如sed:

s/\\sbar=\\w\\+//g

這正確地說明了foobar = bar。

像Waxrat的答案一樣,您必須在開頭插入一個空格以使其正確匹配,因為它現在與bar=之前的前一個空格字符匹配。 因為您要顯式引用字符串,所以可以輕松完成此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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