sed regexp в скрипте bash - PullRequest
       5

sed regexp в скрипте bash

0 голосов
/ 29 июня 2010

Я хочу извлечь определенную часть строки, если она существует. Меня интересует имя файла xml, т.е. я хочу, чтобы между "_" и ".xml".

Это нормально, печатается "555"

MYSTRING=`echo "/sdd/ee/publ/xmlfile_555.xml" | sed 's/^.*_\([0-9]*\).xml/\1/'`
echo "STRING = $MYSTRING"

Это не нормально, потому что возвращает всю строку. В этом случае я не хочу никакого результата. Он печатает "/sdd/ee/publ/xmlfile.xml"

MYSTRING=`echo "/sdd/ee/publ/xmlfile.xml" | sed 's/^.*_\([0-9]*\).xml/\1/'`
echo "STRING = $MYSTRING"

Любые идеи, как получить «пустой» результат во втором случае.

спасибо!

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

Вам просто нужно сказать sed держать язык за зубами, если он не находит соответствия. Для этого используется опция -n.

MYSTRING=`echo "/sdd/ee/publ/xmlfile_555.xml" | sed -n 's/^.*_\([0-9]*\)\.xml/\1/p'`

Я только сделал два изменения в том, что у вас было: вышеупомянутая опция -n для sed и флаг p, который следует после команды s///, которая говорит sed печатать вывод, только если замена была успешно выполнена.

РЕДАКТИРОВАТЬ : я также избежал финала ., как предлагается в комментариях.

0 голосов
/ 29 июня 2010
$ path=/sdd/ee/publ/xmlfile_555.xml
$ echo ${path##*/}
xmlfile_555.xml
$ path=${path##*/}
$ echo ${path%.xml}
xmlfile_555
$ path=${path%.xml}
$ echo ${path##*_}
555
0 голосов
/ 29 июня 2010

Попробуйте это?

basename /sdd/ee/publ/xmlfile_555.xml | awk -F_ '{print $2}'

Выход составляет 555.xml

С другим.

basename /sdd/ee/publ/xmlfile.xml | awk -F_ '{print $2}'

Вывод - пустая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...