如何使用sed将一个字符的前n个匹配替换为另一个字符

时间:2013-12-17 16:07:15

标签: sed

我的文件行包含零填充值。 我想用空格替换所有前导零,但最多只能替换7次。

00000002:   <text>

将上述内容更改为以下

       2:   <text>

我有sed脚本

s/^0/ /;: loop s/ 0/  /;t loop

它取代了所有的零。

该行

00000000:   <text>

更改为

        :   <text>

我想

       0:   <text>

如果sed循环能够在6次循环后停止,就会发生这种情况。

如何在6(n)次循环后将sed脚本更改为停止。

是的,我可以强行推出它并放入s/ 0/ /的6个版本。

4 个答案:

答案 0 :(得分:2)

嗯,这可能是作弊,我不确定它是否适用于你所有的角落情况:

sed 's/^0/ /;s/0:/x:/;: loop s/ 0/  /;t loop;s/x:/0:/'

实际上,更好的是:

sed 's/^0/ /;: loop s/ 0/  /;t loop;s/ :/0:/'

答案 1 :(得分:2)

Perl非常方便:

$ printf "%08d: blah\n" {0..12..4}
00000000: blah
00000004: blah
00000008: blah
00000012: blah
$ printf "%08d: blah\n" {0..12..4} | perl -pe 's/^0+(?=\d+:)/ " " x length($&) /e'
       0: blah
       4: blah
       8: blah
      12: blah

答案 2 :(得分:2)

这可能适合你(GNU sed):

sed -r 's/[^0]/\n&/;h;y/0/ /;G;s/\n.*\n//;s/ :/0:/' file

答案 3 :(得分:0)

sed 's/.*/ & /;s/\([²³]\)/\1o/g
   s/\([^[:digit:]]\)\(0\{1,7\}\)\([[:digit:]]\)/\1²\2³\3/g
: space
   s/²\( *\)0\(0*\)³/²\1 \2³/g
   t space
   s/²\( *\)³/\1/g
   s/\([²³]\)o/\1/;s/ \(.*\) /\1/'

{1,7}指定要替换的前导0的数量。

它替换了所有行数的全部0。如果只是找到第一个号码

用这个替换第二行:

s/^\([^[:digit:]]*\)\(0\{1,7\}\)\([[:digit:]]\)/\1²\2³\3/