18

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

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

4

4 回答 4

25

如果我猜对了,您要做的是在匹配的模式中应用替换。您不能使用&. 你想这样做:

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

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

于 2012-10-02T17:13:33.333 回答
18

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

echo apple1 | sed -e 's/\(a\)\(p*\)\(le\)1/\1\2\32/g'

我们使用了三个捕获:

  1. 第一个,存储在 中\1,包含一个“a”
  2. 第二个,存储在 中\2,包含一系列“p”(在示例中它包含“pp”)
  3. 第三个,存储在 中\3,包含序列“le”

现在我们可以使用我们捕获的匹配来打印替换\1\2\32:请注意,我们使用 3 个捕获值来生成“apple”,然后我们附加一个 2。这不会被解释为变量\32,因为我们总共只能有 9 个捕获。

希望这会有所帮助=)

于 2012-10-02T17:38:58.930 回答
13

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

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

此代码在包含的所有行中更改12apple

于 2012-10-02T16:45:15.750 回答
2

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

sed 's/apple1/sed "s|1|2|" <<<"&"/e' file
于 2012-10-02T19:40:31.227 回答