Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sed将一个字符的前n个匹配项替换为另一个字符_Sed - Fatal编程技术网

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

如何使用sed将一个字符的前n个匹配项替换为另一个字符,sed,Sed,我有一个文件,其中包含的文本行的值是零填充的。 我想用空格替换所有前导零,但最多只能替换7次 00000002: <text> 它替换所有的零 线路 00000000: <text> 00000000: 改为 : <text> : 我想要 0: <text> 0: 如果sed循环在6次循环后能够停止,就会发生这种情况 如何将sed脚本更改为在6(n)个循环后停止 是的,我可以强行使用它并放

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

00000002:   <text>
它替换所有的零

线路

00000000:   <text>
00000000:
改为

        :   <text>
我想要

       0:   <text>
0:
如果sed循环在6次循环后能够停止,就会发生这种情况

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


是的,我可以强行使用它并放入6个版本的
s/0/

好吧,这可能是作弊,我不确定它是否适用于你所有的角落案例:

sed 's/^0/ /;s/0:/x:/;: loop s/ 0/  /;t loop;s/x:/0:/'
事实上,更好的是:

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

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
这可能适用于您(GNU-sed):

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

它将替换该行所有编号中的所有0。如果只是第一个找到的号码

将第二行替换为:

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

我错过了这个主意。从右到左工作,而不是从左到右。分号是一个标记。我也更喜欢第二个版本。我仍然像你一样从左到右工作,我认为它更好。我刚刚在您自己的版本后添加了一个额外的
s/:/0://
。只删除7个前导0;-)上标2和3表示什么?我使用它作为分隔符,因为我不能“通过1个特定字符更改组中出现的每个字符”,而不更改字符串其余部分中的相同旧字符,但如果我知道它在2个分隔符之间,我可以更改它。²和³是我的分隔符。我只是首先保证它们不会被“逃避它们”所使用,因为它们不会与我们的新序列混淆,也不会在最后倒退
$ 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
sed -r 's/[^0]/\n&/;h;y/0/ /;G;s/\n.*\n//;s/ :/0:/' file
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/'
s/^\([^[:digit:]]*\)\(0\{1,7\}\)\([[:digit:]]\)/\1²\2³\3/