如果我有一段文字,但主字符的数字重复次数可以改变。sed用一个字符的多个重复代替多个字符的重复
aaaabbbbaaaacccc
而且我想x
给
xxxxbbbbaaaacccc
替换所有的a
在文本的开始我想做到这一点正则表达式和sed
,不是与tr
或awk
。
如果我有一段文字,但主字符的数字重复次数可以改变。sed用一个字符的多个重复代替多个字符的重复
aaaabbbbaaaacccc
而且我想x
给
xxxxbbbbaaaacccc
替换所有的a
在文本的开始我想做到这一点正则表达式和sed
,不是与tr
或awk
。
您可以使用一个循环:
echo aaaabbbbaaaacccc | sed ':l s/^\(x*\)a/\1x/;tl'
答案之一在于采用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
谢谢你的解释 – tom
的Perl太:
。$ perl -pe 's/^a+/ "hello" x length($&) /e' <<< aaaabbbbaaaacccc
hellohellohellohellobbbbaaaacccc
这里的一些作品上输入的至少一条线......
我不得不做一些奇怪的事情来获得评论中...
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
+1:很好。您可以通过使用多行引用字符串作为“sed”的参数来避免该临时文件。如果你使用的是临时文件,你也应该删除临时文件(最好使用“陷阱”,如果用户中断,临时文件仍然被删除)。 –
我实际上希望保存脚本。它是这样发布的,所以你可以把它加到一个shell中。 – Dru
这可能为你工作(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
的开始,如果我想要更换的每次出现'a'有多个字符,例如aaaabbbb会变成hellohellohellohellobbbb – tom
'sed':ls/^ \(\(hello \)* \)a/\ 1hello /; tl'' – perreal
谢谢。这解决了它。 – tom