Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 要匹配和复制到但不包括特定值最后一次出现的正则表达式_Regex_Ksh - Fatal编程技术网

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

Regex 要匹配和复制到但不包括特定值最后一次出现的正则表达式,regex,ksh,Regex,Ksh,在一个regex ksh行中,我需要: 查找某个特定字符串的出现情况,后跟任意数量的字符,直到某个特定值的最后一次出现为止(在本例中为逗号) 复制与输出匹配的内容,然后 在复制的文本之后、特定值最后一次出现之前插入新值(在本例中为逗号) 因此,如果我的输入字符串如下所示: SEARCH_STRING anything_else(foo,bar), sed -e 's/\(SEARCH_STRING .*\)\(,.*\)/\1 INSERTED_VALUE\2/' 我想要输出的是: SEAR

在一个regex ksh行中,我需要:

  • 查找某个特定字符串的出现情况,后跟任意数量的字符,直到某个特定值的最后一次出现为止(在本例中为逗号)
  • 复制与输出匹配的内容,然后
  • 在复制的文本之后、特定值最后一次出现之前插入新值(在本例中为逗号)
  • 因此,如果我的输入字符串如下所示:

    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/'
    

    基本上,我们在最后一个逗号之前和之后做一个后向引用,然后将它与StuttEdValue一起放在中间。

    谢谢托马斯的建议。这是一个好主意,但唯一的问题是它丢失了关键的最后一个字符(我希望在插入_值后保留)。它产生的输出是:SEARCH\u STRING anythis\u(foo,如果一行末尾没有逗号,则插入的_值为bar噢,我明白了。我错过了你问题的这一部分。现在已修复。托马斯,这太棒了-谢谢。对于额外的加分,是否有任何方法可以使插入的_值出现在最后一个字符之后,如果它不是逗号,请(我感谢这不是我最初要求的)?我可能会分两次执行此操作:一次匹配最后一个字符为逗号,另一次匹配除逗号以外的所有字符。在第一种情况下,您可以如上所述执行操作,在第二种情况下,您只需附加插入的值。只需在
    $
    之前使用character类(引号内的一个)以及
    \2
    在替换中的位置。谢谢,伙计,我希望我们可以使用环顾操作符或其他方法来避免两次传递。不过,kudos++感谢rvalvik的建议。我理解您在这里尝试做的事情,这非常有意义,但不幸的是,如果l结尾没有逗号,它就不起作用了ine(发生这种情况时产生与上述相同的输出)您最初的问题指出,您希望在某个特定值的最后一次出现后插入新值,即逗号。如果您删除末尾的逗号,那么最后一个逗号就是
    foo
    之后的逗号,因此我觉得这是对的。编辑:似乎我没有完全阅读所有内容。如果您需要,我不确定您要问什么匹配最后一个逗号,但仅当它是“右最后一个逗号”时。您需要匹配其他内容:/是的,我理解这有点棘手。公平地说,我希望它匹配到但不包括最后一个逗号,或最后一个非逗号的字符(最后一个逗号始终是“右”一个).新的值总是在匹配的值之前。再次感谢您的帮助。