Написание регулярных выражений с определенным шаблоном sed / awk / perl - PullRequest
3 голосов
/ 27 марта 2012

Как я могу захватить группу 1 из шаблона ниже с любым из следующих (sed, awk, perl)?

Шаблон регулярного выражения \[(.*)\] для строки ниже, я хочу захватить группу 1,что-то между []

Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules

Вот то, чего я пытаюсь достичь, над строкой приведен простой ввод.Ниже приведен простой вывод:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1

Обновление вопроса:

Фактический пример ввода (извините за пропуски, не знаю, что это было необходимои немного сложнее):

Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules [[COUNT_ALL]].

Ответы [ 4 ]

5 голосов
/ 27 марта 2012

Вы испытываете жадность проблемы.

Следовательно, вы подходите:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules [[COUNT_ALL]

вместо:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1

Помните: .* соответствие жадный . (соответствует наибольшему возможному промежутку)

Возможные решения:

  • снижение жадности: (не в sed и awk IIRC)
    \[(.*?)\]

  • Снижение жадности по старинке:
    \[([^\]]*)\]

  • просто совпадающие слова: ([A-Za-z_])
    \[(\w*)\]

2 голосов
/ 27 марта 2012
$ echo 'Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules' | command_bellowing

sed

$ sed -r 's/.*\[(.*)\].*/\1/'

gawk

$ gawk '{print gensub(/.*\[(.*)\].*/, "\\1", "g")}'

perl

$ perl -ne 's/.*\[(.*)\].*/\1/;print'
0 голосов
/ 27 марта 2012

Это может работать для вас:

sed 's/^[^[]*\[\([^]]*\).*/\1/' file
0 голосов
/ 27 марта 2012

Как сказал Алекс, вы его захватили. Если вы хотите получить результат, попробуйте:

s/\[(.*)\]/$1/

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