Regex 要匹配和复制到但不包括特定值最后一次出现的正则表达式
在一个regex ksh行中,我需要:Regex 要匹配和复制到但不包括特定值最后一次出现的正则表达式,regex,ksh,Regex,Ksh,在一个regex ksh行中,我需要: 查找某个特定字符串的出现情况,后跟任意数量的字符,直到某个特定值的最后一次出现为止(在本例中为逗号) 复制与输出匹配的内容,然后 在复制的文本之后、特定值最后一次出现之前插入新值(在本例中为逗号) 因此,如果我的输入字符串如下所示: SEARCH_STRING anything_else(foo,bar), sed -e 's/\(SEARCH_STRING .*\)\(,.*\)/\1 INSERTED_VALUE\2/' 我想要输出的是: SEAR
SEARCH_STRING anything_else(foo,bar),
sed -e 's/\(SEARCH_STRING .*\)\(,.*\)/\1 INSERTED_VALUE\2/'
我想要输出的是:
SEARCH_STRING anything_else(foo,bar) INSERTED_VALUE,
到目前为止,我的sed表达式如下所示(它只匹配并复制逗号第一次出现之前的所有内容,而不是最后一次出现之前的内容):
…这导致:
SEARCH_STRING anything_else(foo INSERTED_VALUE,bar)
…这不太正确。我知道我需要使用一些类似于消极前瞻的东西,但不能完全正确地使用语法。如果您能提供任何建议,我们将不胜感激,谢谢。我还需要在行尾做同样的替换,即使没有找到逗号,也请(尽管我知道这可能需要一个单独的问题和表达式)。提前感谢您提供的任何建议……使用
$
特殊字符匹配行尾,使用
特殊字符匹配行尾之前的最后一个字符:
sed 's/\(SEARCH_STRING .*\)\(.\)$/\1INSERTED_VALUE\2/'
如果知道匹配表达式中的最后一个点始终是要替换的字符,则可以使用逗号替换该点。如果最后一个字符不同,则使用点将匹配任何此类字符。但是,它的一个缺点是,它还匹配空格,因此如果您的行在逗号后有一些额外的空格,则此表达式将删除空格,而不是逗号
要替换最后一个非空白字符,请改用此表达式:
sed 's/\(SEARCH_STRING .*\)\(\S\s*\)$/\1INSERTED_VALUE\2/'
最简单的方法是使用lookahead
SEARCH\u字符串。*(?=,)
,但是sed不支持这一点,您可以这样做:
SEARCH_STRING anything_else(foo,bar),
sed -e 's/\(SEARCH_STRING .*\)\(,.*\)/\1 INSERTED_VALUE\2/'
基本上,我们在最后一个逗号之前和之后做一个后向引用,然后将它与
$
之前使用character类(引号内的一个)以及\2
在替换中的位置。谢谢,伙计,我希望我们可以使用环顾操作符或其他方法来避免两次传递。不过,kudos++感谢rvalvik的建议。我理解您在这里尝试做的事情,这非常有意义,但不幸的是,如果l结尾没有逗号,它就不起作用了ine(发生这种情况时产生与上述相同的输出)您最初的问题指出,您希望在某个特定值的最后一次出现后插入新值,即逗号。如果您删除末尾的逗号,那么最后一个逗号就是foo
之后的逗号,因此我觉得这是对的。编辑:似乎我没有完全阅读所有内容。如果您需要,我不确定您要问什么匹配最后一个逗号,但仅当它是“右最后一个逗号”时。您需要匹配其他内容:/是的,我理解这有点棘手。公平地说,我希望它匹配到但不包括最后一个逗号,或最后一个非逗号的字符(最后一个逗号始终是“右”一个).新的值总是在匹配的值之前。再次感谢您的帮助。