Як використовувати grep для змінної або рядка?


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 для рядка або змінної, а потім зберегти результат в іншій змінній?


не вдається вирішити це зворотними котируваннями. Це синтаксис отримання результату команди в змінну. r=`echo abc`echo $ r
барлоп

Відповіді:


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

Хороша відповідь. Я знав про форму заміни команд backtick / backquote, але забув про $()форму.
Арканон

@Arkanon: ``це старий стиль; $()чистіше.
sds

0

Чому overkill grep and echo I / O overkill, я б запропонував використовувати можливості обробки bash string:

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

Регекс можна оптимізувати та не є ідеальним, але ось основні принципи:

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

Перевірте інші Баш можливості роботи зі рядками в TLDP тут .


0

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

if [[ $TESTFNAME =~ \.[0-9]+$ ]]; then
  VAL=$(egrep -o '[0-9]+$' <<<"$TESTFNAME")
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.