如何使用与号 (&) 替换匹配模式中的字符

Posted

技术标签:

【中文标题】如何使用与号 (&) 替换匹配模式中的字符【英文标题】:How to replace a character within a matched pattern using ampersand (&) 【发布时间】:2012-09-23 13:24:34 【问题描述】:

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

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

【问题讨论】:

这不是您使用& 的方式。如果您解释了为什么要这样做,这可能会有所帮助。 【参考方案1】:

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

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

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

【讨论】:

请向像我这样的长期 sed 新手解释为什么这比 sed 's/apple1/apple2/g' 更好。因为我想使用 sed '/apple./ s/1/2/g; ' 并将其更改为 botemo2 这完全违反直觉。 @StevenLu sed 是面向行的,所以/apple./ 的意思是:仅将要遵循的命令应用于与模式匹配的行。由于botemo1 在同一行,sed 也会对其应用替换。【参考方案2】:

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

sed 's/apple1/sed "s|1|2|" <<<"&"/e' file

【讨论】:

好的,解决了...通常会插入“替换”字符串,但 GNU sed 使用 e 标志来执行它并插入其输出。执行的命令将&amp;(匹配模式)作为此处字符串传递给sed "s|1|2",其中| 代替了更传统的/【参考方案3】:

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

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 个捕获。

希望这会有所帮助 =)

【讨论】:

是的,但这不能在一行中处理多个匹配项。 反向引用旨在引用“存储的匹配”(如 OP 所说);问题是关于替换那些字符串,而不是那些。 在 7heo.tk 的评论中添加示例。您可以像这样使用反向引用:sed -e 's/\(a\)\(p*\)\(le\)1 \1\2\32/\1\2\33 \1\2\34/' 将用apple3 apple4 替换apple1 apple2,它也可以与appple1 appple2 一起工作(如果你愿意),从而产生appple3 appple4。但是,它不会替换apple1 aple2appple1 apple2apple1 appple2,因为它们没有存储在捕获中的相同字符串(即,比较单词时,它们不一样)。 @JanitoVaqueiroFerreiraFilho 我不知道您可以在正则表达式的匹配部分中使用反向引用。你知道它是不是 POSIX 吗? @7heo.tk 是的,AFAICT,它是 BRE(基本正则表达式)的一部分,每个支持 POSIX 的 sed 都应该实现 (pubs.opengroup.org/onlinepubs/007904975/basedefs/…)。【参考方案4】:

您可以先匹配一个模式,然后如果匹配则更改文本:

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

此代码在包含apple 的所有行中将1 更改为2

【讨论】:

谢谢!阅读此答案后,我觉得我更了解sed

以上是关于如何使用与号 (&) 替换匹配模式中的字符的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL Developer Find & Replace 中使用正则表达式模式时,如何访问匹配的对象以进行替换?

根据匹配用替换字符串替换字符串中的正则表达式模式

通过正则表达式模式匹配使用 stringbuilder 替换多次出现的字符串

与号 url 编码和查询字符串参数问题

在值中使用与号 (&) 时 List.js 不起作用

Perl中的模式匹配和模式替换介绍