使用sed只改变连续重复的字母,一般情况

时间:2012-06-11 15:13:07

标签: text sed

this question我问过如何做到这一点但是大写的特殊情况导致了一个特殊情况的解决方案,因为它允许使用/u。所以我在这里问一般。我发现我必须在不同情况下使用它,而不仅仅是大写。

使用sed,如何将字母'a'更改为'cool',但前提是它重复显示为两个或多个连续字母。例如,来自:

galaxy
ear
aardvak
Haaaaaaaaa 

galaxy
ear
coolcoolrdvak
Hcoolcoolcoolcoolcoolcoolcoolcoolcool 

4 个答案:

答案 0 :(得分:2)

删除的答案几乎解决了它:

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

答案 1 :(得分:1)

sed -r 's;aa;coola;g;s;aa;cool;g;s;coola;coolcool;g' inputFile

一般来说,

的bash

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

答案 2 :(得分:0)

这可能对您有用:

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

答案 3 :(得分:0)

列夫得到了正确的榜样。约翰王子给出了一般情况,但得到的公式错了,还有一步。

经过一些测试和思考,合并我们得到的两个:

l='a'    #search string
r='cool' #replacement string
sed "s,$l$l,$r$r,g ; s,$r$l,$r$r,g," inputFile

测试并告诉我,它对我有用。