在一个正则表达式ksh行中,我需要:
所以,如果我的输入字符串看起来像这样:
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)
......这不太对劲。我知道我需要使用类似负面看的东西 - 但是不能完全正确地使用语法。非常感谢您提出的任何建议,谢谢。我还需要在行尾尽可能顺便地进行相同的替换,即使找不到逗号也请(尽管我很欣赏这可能需要单独的问题和表达)。提前感谢您提出的任何建议......
答案 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
中间的内容拼凑在一起。