2

Я пишу сценарий bash, и мне нужно проверить, есть ли в имени файла номер в конце (после периода) и, если да, получить его, но я не могу понять, как использовать регулярные выражения для переменной или строки.

Я смог использовать echo в терминале для передачи строки в grep, вот так:

 echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

Но мне нужно назначить вывод этого переменной. Я пытался сделать это:

 revNumber= echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

Но это не работает. Я пробовал кучу других вещей, но ничего не получалось.

В моем bash-скрипте я хочу использовать grep для переменной, а не для строки, но концепция здесь та же.

Как я могу использовать grep для строки или переменной, а затем сохранить результат в другой переменной?

3 ответа3

5

Чтобы назначить вывод команды переменной, используйте $():

revNumber=$(echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+")

Если все, о чем вы заботитесь, совпадает, вы можете рассмотреть case:

case foo in
  f*) echo starts with f
   ;;
  *) echo does not start with f
   ;;
esac
0

Ниже приведен еще один вариант, который использует сравнение регулярных выражений bash перед извлечением значения в конце строки.

if [[ $TESTFNAME =~ \.[0-9]+$ ]]; then
  VAL=$(egrep -o '[0-9]+$' <<<"$TESTFNAME")
fi
0

Почему grep и echo I/O перебивают, я бы предложил использовать возможности обработки строк bash:

TESTFNAME="filename.txt.283" # you can collect this from doing an ls in the target directory

# acquire last extension using a regexp, including the '.':
FEXT=$(expr "$TESTFNAME" : '.*\(\.[[:digit:]][[:digit:]]*\)')

# check if length is more than just the dot, that means we've got digits:
if [  ${#FEXT} -gt 1 ]; then
    echo "Gotcha!" $testFilename ${#FEXT} $FEXT # do whatever you like with the file
fi

Регулярное выражение может быть оптимизировано и не идеально, но вот основы:

  • . * в начале будет искать в конце файла.
  • [[:digit::]] почти такой же, как [0-9], но я считаю его более читабельным

Ознакомьтесь с другими возможностями манипуляции строк bash на TLDP здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .