2

如果我有一段文字,但前导字符的重复次数可以改变。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

我想用给替换文本a开头的所有x

xxxxbbbaaaacccc

我想用正则表达式 and 来做到这一点sed,而不是tror awk

4

6 回答 6

5

您可以使用循环:

echo aaaabbbbaaaacccc | sed ':l s/^\(x*\)a/\1x/;tl'
于 2013-08-22T03:47:21.237 回答
4

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

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

它用原始的's 和 another集合替换行首的零个多个x's 和 an的序列。创建一个标签;如果自上次检查以来执行了替换,则跳转到标签。axx:bbt bbsed

唯一遇到麻烦的情况是,如果您有类似aaaaxaab; 它会跳过第一个并在不应该的时候x翻译后续的 's,优先。a

在 Mac OS X 上进行测试,我不得不将其修改为:

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

使用单个脚本参数,该行根本没有改变。Mac OS Xsed有时对必须使用换行符或新参数的地方很有趣,而 GNUsed则不然。(它:b必须在它自己的参数中或在脚本中自己的行中;替换和跳转在单个参数中是可以的,中间有一个分号。

于 2013-08-22T03:51:03.533 回答
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
于 2013-08-22T05:43:29.720 回答
2

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
于 2013-08-22T06:27:13.747 回答
2

Perl 也是:

$ perl -pe 's/^a+/ "hello" x length($&) /e'  <<< aaaabbbbaaaacccc
hellohellohellohellobbbbaaaacccc
于 2013-08-22T04:05:53.993 回答
1

You just do something like this:

echo 'aaaabbbbaaaacccc' | sed 's/^aaaa/xxxx/'
于 2013-08-22T03:44:55.320 回答