Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Regex 仅更换1个前导零,如果超过1次,则将其丢弃_Regex_Shell_Unix_Sed_Sh - Fatal编程技术网

Regex 仅更换1个前导零,如果超过1次,则将其丢弃

Regex 仅更换1个前导零,如果超过1次,则将其丢弃,regex,shell,unix,sed,sh,Regex,Shell,Unix,Sed,Sh,我想用@精确替换1个前导零,如果找到2个或更多前导零,则丢弃它 0123 00123 000123 123 输出: @123 00123 000123 123 我试过了 sed 's/^0.\{1\}/@/' file 注意:请考虑文件每行中的4条以上记录。您的正则表达式将查找零,后跟任何字符。您要检查它后面是否没有零,但不能替换非零字符 您可以捕获并放回要保留的角色: sed 's/^0\([^0]\)/@\1/' file 或者,您可以注意只替换与此正则表达式匹配的行上的第一个字符:

我想用@精确替换1个前导零,如果找到2个或更多前导零,则丢弃它

0123
00123
000123
123
输出:

@123
00123
000123
123
我试过了

sed 's/^0.\{1\}/@/' file

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

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

您可以捕获并放回要保留的角色:

sed 's/^0\([^0]\)/@\1/' file
或者,您可以注意只替换与此正则表达式匹配的行上的第一个字符:

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

和以往一样,指定某个内容只重复一次是毫无意义和多余的。

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

您可以捕获并放回要保留的角色:

sed 's/^0\([^0]\)/@\1/' file
或者,您可以注意只替换与此正则表达式匹配的行上的第一个字符:

sed '/^0[^0]/s/^0/@/' file
和以往一样,指定某个内容只重复一次是毫无意义和多余的。

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
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

您应该在示例输入中自己的行中包含一个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。

您应该在示例输入中自己的行中包含一个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。

使用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
$
使用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
$

sed'/^00/!s/^0/@/'文件谢谢,以上代码工作正常。sed'/^00/!s/^0/@/'文件谢谢,上面的代码工作正常。我这里还有一个问题,上面的列在文件的第二位。表示数据看起来像101 | 0123,然后使用| 0而不是^0,假设正好有两列。您确实需要在问题中显示实际数据,以获得适用于您的数据的答案!我这里还有一个问题,上面的列在文件的第二位。表示数据看起来像101 | 0123,然后使用| 0而不是^0,假设正好有两列。您确实需要在问题中显示实际数据,以获得适用于您的数据的答案!