Замените только 1 ведущий ноль, если он больше 1 раза, то отбросьте его - PullRequest
0 голосов
/ 22 января 2019

Я хочу, чтобы не заменять ровно 1 начальный ноль на @, если найдено 2 или более ведущих нулей, тогда отбросить его.

0123
00123
000123
123

Выход:

@123
00123
000123
123

Я пытался

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

Примечание: пожалуйста, обратите внимание на 4 записи в каждой строке файла.

Ответы [ 4 ]

0 голосов
/ 22 января 2019

Использование 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
$
0 голосов
/ 22 января 2019

Один в 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 голосов
/ 22 января 2019

Вы должны были включить один 0 в своей строке в качестве примера ввода, так как это крайний случай, который может быть пропущен:

$ cat file
0123
00123
000123
123
0

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

Вышеуказанное будет работать с любым sed, который имеет опцию -E для использования ERE, например, GNU sed и BSD / OSX sed.

0 голосов
/ 22 января 2019

Ваше регулярное выражение ищет ноль, за которым следует любой символ.Вы хотите проверить, что за ним не стоит ноль, но не заменить ненулевой символ.

Вы можете захватить и вернуть символ, который хотите сохранить:

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

Или выможет позаботиться о замене только первого символа в строках, которые соответствуют этому регулярному выражению:

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

Как всегда, указание, что что-то повторяется ровно один раз, бессмысленно и излишне.

...