Как закодировать sed для удаления нескольких строк после ключевого слова до достижения следующей пустой строки

60
9

Может ли кто-нибудь посоветовать мне, как закодировать сценарий sed, который можно использовать для обновления текстового файла следующим образом:

Каждый раз, когда встречается строка в файле, содержащем символьную строку "Header_one": - удаляйте строки, которые немедленно следуют строке "Header_one", до тех пор, пока не встретится следующая пустая строка. - но не удаляйте строку "Header_one"

Так, например, файл, содержащий это:

Header_one
dkrjng
djsje

Header_two
cklrgjsj
djrhg

Header_one
drgbyj
efgjjm
cddess

Header_three
sdfvgg
ddddfy

Будет изменено на:

Header_one

Header_two
cklrgjsj
djrhg

Header_one

Header_three
sdfvgg
ddddfy

Я был бы признателен за любое руководство или решение. Спасибо, Джеймс.

спросил(а) 2018-09-28T15:22:00+03:00 2 года, 2 месяца назад
1
Решение
59

Попробуйте нижний снип

< InputFile sed -e '/Header_one/i Header_one' -e '/Header_one/,/s/d' > outputFile

Идея здесь заключается в том, чтобы заменить содержимое между двумя строками и заменить его заголовком (например, Header_one). Вторая -e часть кодов удаляет данные между заголовком и пространством; а первая часть -e заменяет его новым заголовком Header_one.

InputFile и OutputFiles - это простые переадресации.

Вы также можете посмотреть: https://askubuntu.com/questions/637003/delete-lines-between-2-strings

Надеюсь это поможет :)

ответил(а) 2018-09-28T18:06:00+03:00 2 года, 2 месяца назад
42

Использование Perl

perl -ne ' {  print "Header_one\n" if /Header_one/ ; print if not /Header_one/../^$/ } ' 

ответил(а) 2018-09-28T17:56:00+03:00 2 года, 2 месяца назад
42

sed - это редактор потоков, и хотя одна популярная версия sed предоставляет опцию, которая, как представляется, позволяет редактировать файлы, я настоятельно рекомендую ее использовать. Тем не менее, вы можете создать желаемый результат:

sed -e '/Header_one/i\
Header_one\
\
' -e '/Header_one/,/^$/d' input

Обратите внимание, что это намного чище, если вы не требуете сохранения этой пустой строки:


sed -e '/Header_one/p' -e '/Header_one/,/^$/d' input

Также: awk '/Header_one/{printf "Header_one\n\n"; next } 1' RS= ORS='\n\n' input awk '/Header_one/{printf "Header_one\n\n"; next } 1' RS= ORS='\n\n' input

ответил(а) 2018-09-28T17:51:00+03:00 2 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема