Как извлечь текст из строки с помощью sed?
Моя примерная строка выглядит следующим образом:
This is 02G05 a test string 20-Jul-2012
Теперь из этой строки я хочу извлечь 02G05
. Для этого я попробовал следующее regex с sed
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Но вышеприведенная команда ничего не печатает, и я полагаю, что она не может сопоставить что-либо с шаблоном, который я передал sed.
Итак, мой вопрос в том, что я делаю неправильно здесь и как его исправить.
Когда я пытаюсь использовать приведенную выше строку и шаблон с помощью python, я получаю свой результат
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
Ответы
Ответ 1
Шаблон \d
может не поддерживаться вашим sed
. Вместо этого попробуйте [0-9]
или [[:digit:]]
.
Чтобы напечатать только фактическое совпадение (не всю строку соответствия), используйте подстановку.
sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
Ответ 2
Как насчет использования egrep
?
echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
Ответ 3
sed
не распознает \d
, вместо этого используйте [[:digit:]]
. Вам также необходимо выйти из +
или использовать переключатель -r
(-E
в OS X).
Заметим, что [0-9]
работает также для арабско-индусских цифр.
Ответ 4
Попробуйте это вместо:
echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'
Но обратите внимание: если на одной строке есть два шаблона, он будет печатать второй.
Ответ 5
Попробуйте использовать rextract (https://github.com/kata198/rextract)
который позволит вам извлекать текст с использованием регулярного выражения и переформатировать его.
Пример:
[$] echo "Это 02G05 тестовая строка 20-Jul-2012" |./rextract '([\ d] + G [\ d] +)' '$ {1}'
2G05