Подтвердить что ты не робот

Как извлечь текст из строки с помощью 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']
>>>
4b9b3361

Ответ 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