Моя примерная строка выглядит следующим образом:
This is 02G05 a test string 20-Jul-2012
Теперь из приведенной выше строки я хочу извлечь 02G05
. Для этого я попробовал следующее регулярное выражение с 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']
>>>
sed
. Их ароматы регулярных выражений совершенно разные.Ответы:
Возможно, шаблон
\d
не поддерживается вашимsed
. Попробуйте[0-9]
или[[:digit:]]
вместо этого.Чтобы напечатать только фактическое совпадение (а не всю строку соответствия), используйте замену.
sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
источник
.*
это необходимо с вашим регулярным выражением, потому что, когда я пытаюсь,sed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'
он просто печатает всю строку.2G05
не печатает02G05
. Выражение, которое работает's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'
бы более общего. (Я предполагаю, что выsed
поддерживаете\?
ноль или один случай.)\w
\s
Как насчет использования
grep -E
?echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'
источник
sed
этого случая можно было бы разработать сложный сценарий, но зачем?egrep
использует расширенное регулярное выражениеsed
иgrep
использует стандартное регулярное выражениеegrep
илиgrep -e
илиsed -E
использует расширенное регулярное выражение, а код python в вопросе использует PCRE (общее регулярное выражение perl) GNU grep может использовать PCRE с-P
опцией.egrep
илиgrep -E
илиsed -r
grep
должен-m 1
остановиться после первого матча.sed
не распознает\d
, используйте[[:digit:]]
вместо этого. Вам также нужно будет выйти из+
или использовать-r
переключатель (-E
в OS X).Обратите внимание, что
[0-9]
это также работает с арабско-индуистскими цифрами.источник
sed -n '/[0-9]\+G[0-9]\+/p'
. Теперь он просто печатает всю строкуПопробуйте вместо этого:
echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'
Но обратите внимание: если в одной строке есть два шаблона, будет напечатан второй.
источник
Попробуйте использовать rextract . Это позволит вам извлекать текст с помощью регулярного выражения и переформатировать его.
Пример:
$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}' 2G05
источник
\d
совершенно излишни.