1

在一个正则表达式 ksh 行中,我需要:

  1. 查找特定字符串的出现,后跟任意数量的字符,直到最后出现特定值(在本例中为逗号),
  2. 复制与输出匹配的东西,然后
  3. 在复制的文本之后和特定值的最后一次出现之前插入一个新值(在本例中为逗号)

因此,如果我的输入字符串如下所示:

SEARCH_STRING anything_else(foo,bar),

我想输出的是:

SEARCH_STRING anything_else(foo,bar) INSERTED_VALUE,

到目前为止,我的 sed 表达式看起来像这样(它只匹配并复制所有内容,直到第一次出现逗号,而不是最后一次):

sed -e 's/SEARCH_STRING [^,]\+/& INSERTED_VALUE/' 

...这导致:

SEARCH_STRING anything_else(foo INSERTED_VALUE,bar)

……这不太对。我知道我需要使用负面展望——但不能完全正确地使用语法。您能提供的任何建议将不胜感激,谢谢。即使没有找到逗号,我也需要在行尾顺便做同样的替换(尽管我很欣赏这可能需要一个单独的问题和表达)。提前感谢您提供的任何建议....

4

2 回答 2

1

使用$特殊字符匹配行尾,使用.特殊字符匹配之前的最后一个字符:

sed 's/\(SEARCH_STRING .*\)\(.\)$/\1INSERTED_VALUE\2/'

如果您知道这始终是您要替换的字符,您可以用逗号替换匹配表达式中的最后一个点。如果最后一个字符不同,那么使用点将匹配任何这样的字符。然而,一个缺点是它也匹配空格,所以如果你的行在逗号后面有几个额外的空格,这个表达式将删除一个空格,而不是逗号。

要替换最后一个非空白字符,请改用此表达式:

sed 's/\(SEARCH_STRING .*\)\(\S\s*\)$/\1INSERTED_VALUE\2/'
于 2013-03-06T21:55:43.947 回答
1

最简单的方法是使用前瞻SEARCH_STRING .*(?=,),但 sed 不支持这一点,您可以这样做:

sed -e 's/\(SEARCH_STRING .*\)\(,.*\)/\1 INSERTED_VALUE\2/'

INSERTED_VALUE基本上,我们对最后一个逗号之前和之后的内容进行反向引用,然后在中间将其拼凑起来。

于 2013-03-06T22:01:02.643 回答