Распечатать текст между () sed - PullRequest
1 голос
/ 12 мая 2011

Это расширение моего предыдущего вопроса . В этом вопросе мне нужно было извлечь текст в скобках, где весь текст был в одной строке. Теперь у меня есть этот случай:

(aop)
(abc
d)

На этот раз открывающая скобка может находиться в одной строке, а закрывающая скобка - в другой строке, поэтому:

(abc
d)

также считается как текст между разделителями '( )', и мне нужно напечатать его как

abc
d

EDIT: В ответ на возможные путаницы в моем вопросе позвольте мне немного уточнить. По сути, мне нужно печатать текст между разделителями, который может занимать несколько строк.

например, у меня есть этот текст в моем файле:

randomtext(1234
567) randomtext
randomtext(abc)randomtext

Теперь я хочу, чтобы Сед выбрал текст между разделителем "(" и ")". Таким образом, результат будет:

1234
567
abc

Обратите внимание, что левая и правая скобки не в одной строке, но они все еще считаются разделителем для 1234 567, поэтому мне нужно напечатать эту часть текста. (обратите внимание, я хочу только текст между первой парой разделителей).

Буду признателен за любую помощь.

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

Ах! еще одна хитрая головоломка:)

Я считаю, что этот код будет работать для вашей проблемы:

sed -n '/(/,/)/{:a; $!N; /)/!{$!ba}; s/.*(\([^)]*\)).*/\1/p}' file

OUTPUT

Для предоставленного ввода получено:

1234
567
abc

Пояснение:

  • -n подавляет обычный вывод sed
  • /(/,/)/ для выбора диапазона от ( до )
  • :a для маркировки этикетки а
  • $!N означает добавление следующей строки ввода в текущее пространство шаблона
  • /)/! означает выполнить некоторые действия, если ) не соответствует текущему шаблону
  • /)/!${!ba} означает переход к метке a, если ) не соответствует текущему шаблону
  • s/.*(\([^)]*\)).*/\1/ означает замену содержимого между ( и ) только содержимым, исключая скобки
  • \1 - для обратной ссылки на группу 1, т.е. текст между \( и \)
  • p для печати замененного содержимого
0 голосов
/ 12 мая 2011

Эта ссылка имеет ответ. Я перефразирую, чтобы соответствовать вашим потребностям:

sed -n '1h;1!H;${;g;s/.*(\([^)]*\)).*/\1/;p}' < your_input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...