Удалить ведущую строку в bash

10

У меня есть строка типа, rev00000010и я хочу только последний номер, 10 в этом случае.

Я пробовал это:

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

оба ничего не возвращают, хотя регулярное выражение кажется правильным (пробовал с регулярным выражением )

Майкл Ниманд
источник
связанные: stackoverflow.com/questions/16623835/…
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

16

Команды, которые вы передали, sedозначают: если строка соответствует регулярному выражению, удалите ее . Это не то, что вы хотите.

echo "$TEST" | sed 's/rev0*//'

Это означает: в каждой строке удалите rev, а затем любое количество нулей.

Кроме того, вам не нужно sedдля такой простой вещи. Просто используйте bash и расширение его параметров :

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to `rev`
                         # followed by the maximal number of zeroes.
choroba
источник
5

POSIXly:

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

Убрал бы каждую вещь слева от самой левой ненулевой цифры.

Bournely / универсально:

number=`expr "x$test" : 'xrev0*\(.*\)'`
Стефан Шазелас
источник
Первый сломается с точками, шестнадцатеричном, пробелы и т.д.: test='rev 003A0.1056'будет производить number="3A0.1056". Второе будет разбито на любое пространство, то же самое значение получит: 003A0.1056из expr.
3

Если у вас уже есть переменная TEST, просто распечатайте ее, удалив все буквы

printf "%.0f\n" ${TEST//[a-z]/}

или

printf "%g\n" ${TEST//[a-z]/}

Не используйте %dили echo-команда, потому что числа с начальным 0понимается какoctal

Костас
источник
2

Еще несколько опций (хотя я также рекомендую использовать расширение параметров, как предложено @choroba):

  • Используйте sedили perlдля замены всего, кроме двух последних символов, последними двумя. Это эффективно удаляет все, кроме двух последних.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • Установите awkразделитель поля на 2 или более 0 и напечатайте последнее поле:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • Извлеките только последние два символа:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • Выведите только 10-ые последние байты:

    $ cut -b 10- <<<$TEST
    10
    

Обратите внимание, что все вышеперечисленное использует <<<$varконструкцию bash. Чтобы использовать его в других оболочках, измените на echo "$TEST" | command.

Тердон
источник
1
Для awk другой вариант, который может избежать некоторых проблемawk -F"[a-z]" '{print +$NF}'
Costas
0

Чтобы получить «последнее число», выберите любую последовательность цифр в конце строки и преобразуйте ее в десятичное число:

С Bash:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

С grep:

echo "$test" | grep -Po "[1-9][0-9]*$"

источник