在这个问题中,我询问了如何做到这一点,但大写的特殊情况导致了一个也是特殊情况的解决方案,因为它允许使用/u
. 所以在这里我问得更笼统。我发现我必须在不同的情况下使用它,而不仅仅是大写。
使用sed
,如何将字母“a”更改为“cool”,但前提是它以两个或多个连续字母重复出现。示例,来自:
galaxy
ear
aardvak
Haaaaaaaaa
进入
galaxy
ear
coolcoolrdvak
Hcoolcoolcoolcoolcoolcoolcoolcoolcool
删除的答案几乎解决了它:
sed 's/aa/coolcool/g; s/coola/coolcool/'
如果一个人不知道要替换的字母,它就会变得更具挑战性。我只能想出相当可怕和自我重复的
sed '/\([[:alpha:]]\)\1/ {h; s/.*\([[:alpha:]]\)\1.*/\1/; x; s/\([[:alpha:]]\)\1/coolcool/g; G; s/cool\(.\)\(.*\)\n\1/coolcool\2/; s/\n.*//}'
这改变了
galaxy
ear
bbrdvak
Haaaaaaaaa
(注意第三个词)
galaxy
ear
coolcoolrdvak
Hcoolcoolcoolcoolcoolcoolcoolcoolcool
sed -r 's;aa;coola;g;s;aa;cool;g;s;coola;coolcool;g' inputFile
一般来说,
l='a' #search string
r='cool' #replacement string
sed -r "s;$l$l;$r$l;g;s;$l$l;$r;g;s;$r$l;$r$r;g" inputFile
这可能对您有用:
sed ':a;s/\(a\|cool\)a/coolcool/g;ta' file
或更一般地说:
sed ':a;s/\(a\|\n\)a/\n\n/g;ta;s/\n/cool/g' file
列夫的例子是对的。约翰王子给出了一般情况,但把公式弄错了,而且还多了一步。
经过一些测试和思考,合并我们得到的两者:
l='a' #search string
r='cool' #replacement string
sed "s,$l$l,$r$r,g ; s,$r$l,$r$r,g," inputFile
测试它并告诉我,它对我有用。