Использование sed для печати между разделителями - PullRequest
1 голос
/ 17 мая 2011

Это расширение моего предыдущего вопроса , рекомендованного ответчиком. По сути, мне нужен sed для печати текста между разделителями. Разделители могут занимать несколько строк, например:

(abc
d)

Ниже приведен пример ввода и вывода.

Input

(123) 
aa (a(b)cd)) (g) (c)fff 
abcd(aabb 
d)aa (aeb)oe

правильный вывод

123
a(b  
aabb
d

Примечание: мне нужен только текст между первой парой разделителей. Если разделитель занимает две строки, я просто хочу, чтобы текст между первой парой занимал две строки и переходил к третьей (следующей) строке. Таким образом, для последней строки во вводе я напечатал «d», пропустил (aeb) и перешел к следующей строке.

1 Ответ

2 голосов
/ 17 мая 2011

Я использовал файл сценария sed (называемый sedscript), содержащий:

/^[^(]*([^)]*$/N
s/^[^(]*(\([^)]*\)).*/\1/p

и командная строка:

sed -n -f sedscript data

С учетом ввода:

(123)
aa (a(b)cd)) (g) (c)fff
abcd(aabb
d)aa (aeb)oe

Получено:

123
a(b
aabb
d

Вы можете сделать это в одной командной строке с помощью:

sed -n -e '/^[^(]*([^)]*$/N' -e 's/^[^(]*(\([^)]*\)).*/\1/p' data

Первый шаблон ищет строки, содержащие открытую скобку без закрывающей скобки после нее, читает следующую строку в память и начинает заново. Это повторяется до тех пор, пока в данных не будет закрытой скобки (или EOF). Второй шаблон ищет вещи перед открывающей скобкой, открытые скобки, запоминает данные оттуда до первой закрывающей скобки, за которой следуют закрывающая скобка и любые другие вещи; он заменяет это запомненной строкой и печатает ее. Все остальное не напечатано (-n).

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