如果要找到2个或多个前导零,我希望ot用@精确替换1个前导零。
" Shell Command: Install ‘code’ command in PATH "
输出:
0123
00123
000123
123
我尝试过
@123
00123
000123
123
注意:请在文件的每一行中考虑以上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
$