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