仅替换1个前导零,如果大于1次则将其丢弃

时间:2019-01-22 10:09:45

标签: regex shell unix sed sh

如果要找到2个或多个前导零,我希望ot用@精确替换1个前导零。

" Shell Command: Install ‘code’ command in PATH "

输出:

0123
00123
000123
123

我尝试过

@123
00123
000123
123

注意:请在文件的每一行中考虑以上4条记录。

4 个答案:

答案 0 :(得分:2)

awk中的一个:

$ awk '{sub(/^0/,(/^00/?0:"@"))}1' file
@123
00123
000123
123

解释:

$ awk '{sub(/^0/,(/^00/?0:"@"))}1' file
        |    |       |  |  |
        |    |       |  |  otherwise with a @
        |    |       |  with a zero
        |    |       if followed by a zero
        |    leading zero
        replace

,如果它在第二个|分隔字段中,请使用:

$ awk 'BEGIN{FS=OFS="|"}{sub(/^0/,($2~/^00/?0:"@"),$2)}1' file
1|@123|1
2|00123|2
3|000123|3
4|123|4

答案 1 :(得分:2)

您应该在示例输入中在其自己的行上包含一个0,因为这是一个可能会遗漏的边缘情况:

$ cat file
0123
00123
000123
123
0

$ sed -E 's/^0([^0]|$)/@\1/' file
@123
00123
000123
123
@

以上内容适用于具有-E选项以使用ERE的任何sed,例如GNU sed和BSD / OSX sed。

答案 2 :(得分:1)

您的正则表达式查找零,后跟任何字符。您要检查它后面是否没有零,但不要替换非零字符。

您可以捕获并放回要保留的字符:

sed 's/^0\([^0]\)/@\1/' file

或者您可以注意只替换与该正则表达式匹配的行上的第一个字符:

sed '/^0[^0]/s/^0/@/' file

和以往一样,指定仅重复一次是毫无意义且多余的。

答案 3 :(得分:0)

使用Perl

$ cat lead_zero.txt
0123
00123
000123
123
0
$  perl -pe ' s/(^0)(?!0+.*)/@/ ' lead_zero.txt
@123
00123
000123
123
@
$

如果它在管道分隔文件的第二列中,则使用它。

$ cat lead_zero.txt2
a|0123|x
b|00123|y
c|000123|xx
d|00000123|yy
e|123|zz
f|0|qq
$ perl -pe ' s/(.*?\|)0(?!0+.*)/$1@/ ' lead_zero.txt2
a|@123|x
b|00123|y
c|000123|xx
d|00000123|yy
e|123|zz
f|@|qq
$