awk и специальные скобки-разделители

У меня есть данные в следующем формате:

.......{INFO1}.....[INFO2]....

Для awk должно быть очень просто подобрать части INFO1 и INFO2, но я действительно борюсь с этим.

Мне удалось получить часть [INFO2], используя awk -F'[][]' '{ print $2 }', но INFO1 мне просто не подходит.

Как указать {} в качестве разделителей?


person Šimon Tóth    schedule 11.12.2014    source источник
comment
Было бы полезно показать полную строку ваших данных   -  person Tom Fenech    schedule 11.12.2014


Ответы (2)


Просто используйте [][{}], чтобы указать, что вы можете использовать любой из них: [, ], { или } в качестве разделителей полей.

awk -F"[][{}]" '{print ...}' file

В общем, вы говорите -F"[PATTERNS]".

Контрольная работа

$ echo ".......{INFO1}.....[INFO2]...." | awk -F"[][{}]" '{print $2}'
INFO1
$ echo ".......{INFO1}.....[INFO2]...." | awk -F"[][{}]" '{print $4}'
INFO2
person fedorqui 'SO stop harming'    schedule 11.12.2014
comment
LOL, можешь объяснить синтаксис разделителей? Потому что я совсем запутался :-D Почему [][{}] работает, а [{}][] нет? - person Šimon Tóth; 11.12.2014
comment
[ закрывается ], за исключением случаев, когда ] следует сразу за открытием [ - person fredtantini; 11.12.2014
comment
@Let_Me_Be Довольно странно, да: D Насколько я видел, [] вместе заставит регулярное выражение закрыть блок, поэтому вам нужно их разделить. Я пытаюсь найти хороший референс, потому что у меня также были проблемы с определением правильной позиции для них. - person fedorqui 'SO stop harming'; 11.12.2014
comment
В противном случае вы можете избежать его (см. руководство): [{}[\]] тоже работает - person fredtantini; 11.12.2014
comment
@fredtantini Спасибо за ссылку. Но, как ни странно, отличается от руководства, с GNU awk 4.0.1, что касается побега, я могу добиться этого только с помощью двойного побега. Вот оно: использование 3 разделителей , / ] (обратите внимание, что нет [) для вырезания aaa[bb,cc,dd/eee]— будет -F '[,/\\]]' или -F "[,/\\\]]". Наконец, -F ',|/|]' оказывается самым простым способом. - person Weekend; 13.02.2019

Вам просто нужно добавить {} к разделителю полей:

~$ echo ".......{INFO1}.....[INFO2]...." | awk -F'[][{}]' '{print $2,$4}'
INFO1 INFO2
person fredtantini    schedule 11.12.2014