Как извлечь число из строки, которой предшествуют нули - PullRequest
0 голосов
/ 05 марта 2019

Я получил строку, которая выглядит следующим образом SOMETHING00000076XYZ

Как мне извлечь число 76 из строки, используя скрипт ? Обратите внимание , что 76 предшествует ноль, а за ним следуют буквы.

Ответы [ 7 ]

1 голос
/ 05 марта 2019

Вы также можете попробовать Perl

$ echo "SOMETHING00000076XYZ" | perl -ne ' /\D+0+(\d+)/ and print $1  '
76
$ a=$(echo "SOMETHING00000076XYZ" | perl -ne ' /\D+0+(\d+)/ and print $1  ')

$ echo $a
76

$
1 голос
/ 05 марта 2019
$ echo 'SOMETHING00000076XYZ' | awk '{sub(/^[^0-9]+/,""); print $0+0}'
76
1 голос
/ 05 марта 2019

Использование gnu grep:

grep -oP '0+\K\d+' <<< 'SOMETHING00000076XYZ'

76

\K сбрасывает любую сопоставленную информацию.


Вот еще один вариант awk:

awk -F '0+' 'match($2, /^[0-9]+/){print substr($2, 1, RLENGTH)}' <<< 'SOMETHING00000076XYZ'

76
1 голос
/ 05 марта 2019

Вы можете использовать sed как

echo "SOMETHING00000076XYZ" | sed "s/[a-zA-Z]//g" | sed "s/^0*//"

  • Первый шаг - удаление всех букв
  • Второй шаг - удаление начальных нулей.
1 голос
/ 05 марта 2019
echo 'SOMETHING00000076XYZ' | grep -o '[1-9][0-9]*'
1 голос
/ 05 марта 2019

Вот вариант sed:

echo "SOMETHING00000076XYZ" | sed -r 's/[^0-9]*0*([0-9]+).*/\1/g';

76

Вот объяснение используемого шаблона регулярного выражения:

[^0-9]*   match zero or more non digits
0*        match zero or more 0's
([0-9]+)  match AND capture any quantity of non zero digits
.*        match the remainder of the string

Затем мы просто заменим на \1, который является первой (и единственной) группой захвата.

1 голос
/ 05 марта 2019

1-е решение: Если вы согласны с awk, не могли бы вы попробовать следующее.

echo "SOMETHING00000076XYZ" | awk 'match($0,/0+[0-9]+/){val=substr($0,RSTART,RLENGTH);sub(/0+/,"",val);print val;val=""}'

Если вы хотите сохранить это в переменной, используйте следующее.

variable="$(echo "SOMETHING00000076XYZ" | awk '{sub(/.*[^1-9]0+/,"");sub(/[a-zA-Z]+/,"")} 1')"

2-е решение: Добавление сюда еще 1 awk решения (с учетом вашего образца).

echo "SOMETHING00000076XYZ" | awk '{sub(/.*[^1-9]0+/,"");sub(/[a-zA-Z]+/,"")} 1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...