Sed 如何使用符号(&;)替换匹配图案中的字符

Sed 如何使用符号(&;)替换匹配图案中的字符,sed,match,ampersand,Sed,Match,Ampersand,当我们使用sed匹配一个模式时,匹配的模式存储在“ampersand”(&)变量中。有没有办法用符号本身替换匹配模式中的字符 例如,如果&包含字符串“apple1”,如何使用&使字符串变为“apple2”(即用2替换1)?您可以先匹配一个模式,然后在匹配时更改文本: echo "apple1" | sed '/apple/s/1/2/' # gives you "apple2" 此代码在包含apple的所有行中将1更改为2,如果我猜对了,您要做的是在匹配的模式中应用替代。您不能使用和来完

当我们使用sed匹配一个模式时,匹配的模式存储在“ampersand”(&)变量中。有没有办法用符号本身替换匹配模式中的字符


例如,如果&包含字符串“apple1”,如何使用&使字符串变为“apple2”(即用2替换1)?

您可以先匹配一个模式,然后在匹配时更改文本:

echo "apple1" | sed '/apple/s/1/2/'    # gives you "apple2"

此代码在包含
apple
的所有行中将
1
更改为
2
,如果我猜对了,您要做的是在匹配的模式中应用替代。您不能使用
来完成此操作。您要改为执行此操作:

echo apple1 apple3 apple1 apple2 botemo1 | sed '/apple./ { s/apple1/apple2/g; }'

这意味着您只想在与模式匹配的行上执行命令替换。
/apple./

您还可以使用捕获组。捕获用于获取匹配的一部分并将其保存到辅助变量中,辅助变量按捕获出现的顺序以数字命名

echo apple1 | sed -e 's/\(a\)\(p*\)\(le\)1/\1\2\32/g'
我们使用了三个捕获:

  • 第一个存储在
    \1
    中,包含一个“a”
  • 第二个存储在
    \2
    中,包含一个“p”序列(在本例中包含“pp”)
  • 第三个存储在
    \3
    中,包含序列“le”
  • 现在,我们可以使用捕获的匹配项打印替换项:
    \1\2\32
    。请注意,我们使用3个捕获值来生成“apple”,然后附加一个2。这不会被解释为变量
    \32
    ,因为我们总共只能有9个捕获

    希望这有帮助=)

    这可能对您有用(GNU-sed和Bash):


    sed's/apple1/sed“s | 1 | 2 |”这不是您使用的方式
    &
    。如果您解释了为什么要这样做,可能会有所帮助。是的,但这不能在一行中处理多个匹配项。反向引用用于引用“存储的匹配项”(如OP所述);问题是如何替换这些中的字符串,而不是那些。在7heo.tk的注释中添加一个示例。您可以使用这样的反向引用:
    sed-e的/\(a\)\(p*\)\(le\)1\1\2\32/\1\2\33\1\2\34/“
    apple1 apple2
    替换为
    apple3 apple4
    ,并且它还可以(如果您愿意)与
    appple1 appple2
    一起工作,从而产生
    appple3 appple4
    。但是,它不会取代
    apple1-aple2
    ,也不会取代
    appple1-apple2
    ,也不会取代
    apple1-appple2
    ,因为它们在捕获中存储的字符串不相同(即,在比较单词时,它们不相同)。@JanitoVaqueiroFerreiraFilho我不知道可以在正则表达式的匹配部分使用反向引用。你知道它是不是POSIX吗?@7heo.tk是的,AFAICT,它是BRE(基本正则表达式)的一部分,每个支持POSIX的sed都应该实现()。请向像我这样的长期sed新手解释为什么这比
    sed's/apple1/apple2/g'
    更好。因为我想使用
    sed'/apple./{s/1/2/g;}'
    并将其更改为
    botemo2
    ,这完全违反直觉。@StevenLu sed是面向行的,所以
    /apple./
    的意思是:只对符合模式的行应用命令。由于
    botemo1
    在同一行中,sed也将对其应用替换。好的,解决它。。。通常插入“替换”字符串,但GNU sed使用
    e
    标志执行该字符串并插入其输出。执行的命令将
    &
    (匹配的模式)作为here字符串传递到
    sed“s | 1 | 2”
    ,其中
    取代了更传统的
    /
    。谢谢!读了这个答案后,我觉得我对sed的理解更好了。
    sed 's/apple1/sed "s|1|2|" <<<"&"/e' file