繁体   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