Видаліть провідну рядок у bash


10

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

Я спробував це:

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

обидва не повертають нічого, хоча, здається, регулярний вираз є правильним (спробували з regexr )


Відповіді:


16

Команди, які ви передали, sedозначають: якщо рядок відповідає регексу, видаліть його . Це не те, чого ти хочеш.

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

Це означає: у кожному рядку видаліть обороти з подальшим будь-яким числом нулів.

Крім того, вам не потрібно 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.

5

POSIXly:

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

Видалить кожну річ зліва від самої лівої від нуля цифри.

Борнлі / універсально:

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яке є баш-конструкцією. Щоб використовувати його в інших оболонках, змініть на echo "$TEST" | command.


1
Для дивовижного іншого варіанту, який може уникнути певної проблемиawk -F"[a-z]" '{print +$NF}'
Костас

0

Щоб отримати "останнє число", виберіть будь-яку послідовність цифр в кінці рядка і перетворіть його в десяткове число:

З Bash:

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

З грепом:

echo "$test" | grep -Po "[1-9][0-9]*$"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.