如果我有一段文字,但前导字符的重复次数可以改变。
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我想用给替换文本a
开头的所有x
xxxxbbbaaaacccc
我想用正则表达式 and 来做到这一点sed
,而不是tr
or awk
。
如果我有一段文字,但前导字符的重复次数可以改变。
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
我想用给替换文本a
开头的所有x
xxxxbbbaaaacccc
我想用正则表达式 and 来做到这一点sed
,而不是tr
or awk
。
您可以使用循环:
echo aaaabbbbaaaacccc | sed ':l s/^\(x*\)a/\1x/;tl'
一个答案在于使用sed
的条件分支机制,我认为:
sed ':b; s/^\(x*\)a/\1x/; t b'
它用原始的's 和 another集合替换行首的零个多个x
's 和 an的序列。创建一个标签;如果自上次检查以来执行了替换,则跳转到标签。a
x
x
:b
b
t b
b
sed
唯一遇到麻烦的情况是,如果您有类似aaaaxaab
; 它会跳过第一个并在不应该的时候x
翻译后续的 's,优先。a
在 Mac OS X 上进行测试,我不得不将其修改为:
sed -e ':b' -e 's/^\(x*\)a/\1x/' -e 't b' <<< aaaaaxaaab
使用单个脚本参数,该行根本没有改变。Mac OS Xsed
有时对必须使用换行符或新参数的地方很有趣,而 GNUsed
则不然。(它:b
必须在它自己的参数中或在脚本中自己的行中;替换和跳转在单个参数中是可以的,中间有一个分号。
这是至少适用于一行输入的东西......
我不得不做一些奇怪的事情来获得评论......
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
This might work for you (GNU sed):
sed 's/a*/&\n/;h;y/a/x/;G;s/\n.*\n//' file
Put a marker before the first non-a. Copy the line to the hold space. Change the line in the pattern space. Append the original line. Remove the unwanted section.
To change a
's to hello
:
sed 's/a*/&\n/;h;s/a/hello/g;G;s/\n.*\n//' file
Perl 也是:
$ perl -pe 's/^a+/ "hello" x length($&) /e' <<< aaaabbbbaaaacccc
hellohellohellohellobbbbaaaacccc
You just do something like this:
echo 'aaaabbbbaaaacccc' | sed 's/^aaaa/xxxx/'