Соответствие регулярному выражению bash-скрипта - PullRequest
3 голосов
/ 01 августа 2011

В моем скрипте bash у меня есть массив имен файлов, например

files=( "site_hello.xml" "site_test.xml" "site_live.xml" )

Мне нужно извлечь символы между подчеркиванием и расширением .xml, чтобы я мог просмотреть их для использования в функции.

Если бы это был Python, я мог бы использовать что-то вроде

re.match("site_(.*)\.xml")

, а затем извлеките первую подходящую группу.

К сожалению, этот проект должен быть в bash, поэтому - Как я могу делать такие вещи в bash-скрипте? Я не очень хорошо разбираюсь в grep, sed или awk.

Ответы [ 4 ]

5 голосов
/ 01 августа 2011

Что-то вроде следующего должно работать

files2=(${files[@]#site_})   #Strip the leading site_ from each element
files3=(${files2[@]%.xml})    #Strip the trailing .xml

РЕДАКТИРОВАТЬ: После исправления этих двух опечаток, кажется, работает:)

2 голосов
/ 01 августа 2011
xbraer@NO01601 ~
$ VAR=`echo "site_hello.xml" | sed -e 's/.*_\(.*\)\.xml/\1/g'`

xbraer@NO01601 ~
$ echo $VAR
hello

xbraer@NO01601 ~
$

Это отвечает на ваш вопрос?

Просто запустите переменные через sed в обратных галочках (``)

Я не помню синтаксис массива в bash, но я думаю,вы сами это хорошо знаете, если программируете bash;)

Если неясно, не стесняйтесь спрашивать снова.:)

0 голосов
/ 02 августа 2011

Если вы используете массивы, вам, вероятно, не следует использовать bash.

Более подходящим примером будет

ls site_*.xml | sed 's/^site_//' | sed 's/\.xml$//'

Это производит вывод, состоящий из частей, которые вы хотели. Backtick или перенаправить по мере необходимости.

0 голосов
/ 01 августа 2011

Я бы использовал cut , чтобы разбить строку.

for i in site_hello.xml site_test.xml site_live.xml; do echo $i | cut -d'.' -f1 | cut -d'_' -f2; done

Это также можно сделать в awk :

for i in site_hello.xml site_test.xml site_live.xml; do echo $i | awk -F'.' '{print $1}' | awk -F'_' '{print $2}'; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...