Sed 如何使用符号(&;)替换匹配图案中的字符
当我们使用sed匹配一个模式时,匹配的模式存储在“ampersand”(&)变量中。有没有办法用符号本身替换匹配模式中的字符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,如果我猜对了,您要做的是在匹配的模式中应用替代。您不能使用和来完
例如,如果&包含字符串“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