Как использовать sed для удаления следующей строки в Solaris - PullRequest
5 голосов
/ 25 ноября 2011

Я пытаюсь использовать sed для поиска подходящего шаблона в файле, затем удаляю только следующая строка.

Ex.

Местоположение
Нью-Йорк <---- удалить <br /> США

Местоположение
Лондон <---- удалить <br /> Великобритания

Я пытался sed '/Location/{n; d}', который работает на Linux, но не работал на Solaris.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 25 ноября 2011

Как я уже упоминал в своем ответе по поводу вашего другого вопроса о sed, Solaris sed является старой школой и нуждается в большем количестве рук (или, иначе говоря), более суетлив в своем синтаксисе.

Все, что вам нужно, это дополнительный ';'char, помещенный после символа `d ', т. е.

sed '/Location/{n; d;}'

В общем, все, что может находиться на новой строке внутри {...}, нуждается в разделителе с запятой, когда оно свернуто на одну строку,Однако вы не можете свернуть команды «a», «i», «c» в одну строку, как в Linux.

В стандартном sed в Solaris «a», i »,Команды 'c' требуют завершающего символа '\' без пробелов или табуляций после него, столько данных, сколько вам нужно (возможно, в пределах некоторого предела K) на \n завершенных строках (NO \r s), за которыми следует пустая строка.

В более новых установках Solaris также может быть установлена ​​/usr/xpg4/bin/sed.Попробуйте

/usr/xpg4/bin/sed '/Location/{n; d}' 

Если вам повезет, он поддержит ваш синтаксис ярлыков.У меня больше нет доступа к машинам Solaris, чтобы проверить это.

Наконец, если это не сработает, можно установить пакеты инструментов GNU, которые будут иметь sed, что намногобольше похоже на то, к чему вы привыкли в Linux.Спросите своих системных администраторов, есть ли уже инструменты GNU или их можно установить.Я не уверен, какая версия gnu sed начала поддерживать «расслабленный» синтаксис, поэтому не думайте, что он будет исправлен без тестирования: -)

Надеюсь, это поможет.

PS Добро пожаловать в StackOverflow и позвольте мне напомнить вам о трех вещах, которые мы обычно делаем здесь: 1) Получая помощь, постарайтесь также оказать ей помощь, отвечая на вопросы в вашей области знаний 2) Читайте часто задаваемые вопросы, http://tinyurl.com/2vycnvr, 3) Когда вы видите хорошие вопросы и ответы, оцените их, используя серые треугольники, http://i.imgur.com/kygEP.png, поскольку доверие к системе основано на репутации, которую пользователи получают, делясь своими знаниями.Также не забудьте принять ответ, который лучше решит вашу проблему, если таковой имеется, нажав на значок галочки, http://i.imgur.com/uqJeW.png

0 голосов
/ 25 ноября 2011

Работает ли это решение AWK для вас -

[jaypal~/temp]$ cat a.txt 
Location
New York <---- delete 
USA

Location
London <---- delete
UK

Обновлен для сохранения пустой строки -

!NF используется для сохранения пустых строк.Это означает, что если Количество полей = 0, то просто выведите строку.NF - встроенная переменная, которая отслеживает количество полей в записи.Если мы встречаем пустую строку, мы пропускаем остальную часть обработки и переходим к следующей строке.

!/Location/ напечатает строки.Это должно сохранить линии, за которыми не следует Местоположение.Печать является неявным действием в AWK всякий раз, когда шаблон является истинным.

Третий шаблон / действие - это место, где мы печатаем строку, когда она соответствует RegEx /Location/.Помимо печати строки, мы дважды используем getline, которая эффективно удаляет вашу следующую строку, а затем печатает ее.

[jaypal~/temp]$ awk '!NF{print;next}; !/Location/; /Location/{print;getline;getline;print}' INPUT_FILE
Location
USA

Location
UK
0 голосов
/ 25 ноября 2011

Вы можете добавить следующую строку к текущей и затем удалить все, что не является Location:

$ cat text 
Location
New York <---- delete
USA

Location
London <---- delete
UK
$ sed '/Location/{N;s/Location.*$/Location/;}' text
Location
USA

Location
UK

У меня нет соляриса, поэтому я хотел бы знать, работает ли он.

...