Regex 仅更换1个前导零,如果超过1次,则将其丢弃
我想用@精确替换1个前导零,如果找到2个或更多前导零,则丢弃它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 或者,您可以注意只替换与此正则表达式匹配的行上的第一个字符:
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,假设正好有两列。您确实需要在问题中显示实际数据,以获得适用于您的数据的答案!