正则表达式匹配和复制,但不包括特定值的最后一次出现

时间:2013-03-06 21:50:28

标签: regex ksh

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

  1. 查找特定字符串的出现,后跟任意数量的字符,直到最后一次出现特定值(在本例中为逗号),
  2. 复制匹配到输出的内容,然后
  3. 在复制的文本之后和最后一次出现特定值之前插入一个新值(在本例中为逗号)
  4. 所以,如果我的输入字符串看起来像这样:

    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)
    

    ......这不太对劲。我知道我需要使用类似负面看的东西 - 但是不能完全正确地使用语法。非常感谢您提出的任何建议,谢谢。我还需要在行尾尽可能顺便地进行相同的替换,即使找不到逗号也请(尽管我很欣赏这可能需要单独的问题和表达)。提前感谢您提出的任何建议......

2 个答案:

答案 0 :(得分:1)

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

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

如果您知道这总是要替换的字符,则可以用逗号替换匹配表达式中的最后一个点。如果最后一个字符变化,则使用点将匹配任何此类字符。然而,一个缺点是它也匹配空格,所以如果你的行在逗号后面有一些额外的空格,这个表达式将删除一个空格,而不是逗号。

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

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

答案 1 :(得分:1)

最简单的方法是使用前瞻SEARCH_STRING .*(?=,),但sed不支持此功能,相反,您可以执行以下操作:

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

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