2013-08-22 36 views

回答

5

您可以使用一个循环:

echo aaaabbbbaaaacccc | sed ':l s/^\(x*\)a/\1x/;tl' 
+0

的开始,如果我想要更换的每次出现'a'有多个字符,例如aaaabbbb会变成hellohellohellohellobbbb – tom

+0

'sed':ls/^ \(\(hello \)* \)a/\ 1hello /; tl'' – perreal

+0

谢谢。这解决了它。 – tom

1

你只是做这样的事情:

echo 'aaaabbbbaaaacccc' | sed 's/^aaaa/xxxx/' 
+0

应该说,我不知道提前多少‘A’将在行 – tom

4

答案之一在于采用sed的条件分支机制,我认为:

sed ':b; s/^\(x*\)a/\1x/; t b' 

它取代了更多的x的0的序列加上a在原始集合x's和另一个x的行开始。 :b创建标签b;如果自上次检查sed以来执行了替换,t b将跳转到标签b

唯一遇到麻烦的是如果你有像aaaaxaab这样的行;它跳过第一个x并翻译其后a的时候它不应该,优先。

测试Mac OS X上,我不得不修改这:

sed -e ':b' -e 's/^\(x*\)a/\1x/' -e 't b' <<< aaaaaxaaab 

使用一个脚本参数,该行并没有变。 Mac OS X sed有时很有趣,关于必须使用换行符或新参数的地方,GNU sed不是。 (这是一个必须在自己的论点或在脚本其自己的行:b;替代和跳跃之间用分号一个参数是OK

+0

谢谢你的解释 – tom

2

的Perl太:

$ perl -pe 's/^a+/ "hello" x length($&) /e' <<< aaaabbbbaaaacccc 
hellohellohellohellobbbbaaaacccc 
3

这里的一些作品上输入的至少一条线......

我不得不做一些奇怪的事情来获得评论中...

echo '{ 
     h     ;# copy the line 
     s/^(a+)(.*)/\1/ ;# get just the leading aa aaaa 
     y/a/x/   ;# change aa to xx 
     x     ;# swap the xx and the line 
     s/^(a+)(.*)/\2/ ;# remove the leading aa from the line bbbbaaaacccc 
     x     ;# swap bbbbaaaacccc for xxxx 
     G     ;# append bbbbaaaacccc 
     s/\n//   ;# get rid of the intervening new line 
}' > s2.sed ; echo aaaabbbbaaaacccc | sed -rf s2.sed  

xxxxbbbbaaaacccc 


echo '{ 
     h     ;# copy the line 
     s/^(a+)(.*)/\1/ ;# get just the leading aa aaaa 
     s/a/hello/g  ;# or change stuff to hello... 
     x     ;# swap the xx and the line 
     s/^(a+)(.*)/\2/ ;# remove the leading aa from the line bbbbaaaacccc 
     x     ;# swap bbbbaaaacccc for xxxx 
     G     ;# append bbbbaaaacccc 
     s/\n//   ;# get rid of the intervening new line 
}' > s3.sed ; echo aaaabbbb| sed -rf s3.sed  

hellohellohellohellobbbb 
+0

+1:很好。您可以通过使用多行引用字符串作为“sed”的参数来避免该临时文件。如果你使用的是临时文件,你也应该删除临时文件(最好使用“陷阱”,如果用户中断,临时文件仍然被删除)。 –

+0

我实际上希望保存脚本。它是这样发布的,所以你可以把它加到一个shell中。 – Dru

2

这可能为你工作(GNU SED):

sed 's/a*/&\n/;h;y/a/x/;G;s/\n.*\n//' file 

之前的第一个非一放的标志物。将该行复制到保留空间。更改模式空间中的行。追加原始行。删除不需要的部分。

要改变a年代到hello

sed 's/a*/&\n/;h;s/a/hello/g;G;s/\n.*\n//' file 
相关问题