Shell: вставьте пустую / новую строку на две строки над рисунком

Чтобы добавить пустую строку над каждой строкой, соответствующей вашему регулярному выражению, вы можете использовать:

sed '/regexp/{x;p;x;}' 

Но я хочу добавить пустую строку, а не одну строку выше, но две строки над строкой, которая соответствует моему регулярному выражению.

Образец, который я буду сопоставлять, – это почтовый индекс в адресной строке.

Вот фрагмент форматирования текста:

случайная информация (относится к предыдущему бизнесу)
Наименование фирмы
деловой адрес

Например:

Языки, на которых говорят: English
Arnold's Cove, Nfld (sub To Clarenville)
Нил-роуд, Arnolds Cove, NL, A0B1N0

Я хотел бы добавить новую строку над названием компании:

Языки, на которых говорят: English

Arnold's Cove, Nfld (sub To Clarenville)
Нил-роуд, Arnolds Cove, NL, A0B1N0

6 Solutions collect form web for “Shell: вставьте пустую / новую строку на две строки над рисунком”

Что-то немного похоже на ваш оригинальный подход в sed:

 sed '/regexp/i\ $H x' 

Основная идея состоит в том, чтобы напечатать все, задержка на одну строку ( x изменить пространство удержания и пространства шаблонов – печать неявно). Это нужно сделать, потому что до тех пор, пока мы не проверим, соответствует ли следующая строка регулярному выражению, мы не знаем, нужно ли мне переводить новую строку или нет.

(В $ H есть всего лишь трюк, чтобы сделать последнюю печать строки. Он добавляет последнюю строку в буфер хранения, так что конечная неявная команда печати выводит ее тоже.)

Более читаемый Perl, и обрабатывает несколько файлов.

 #!/usr/bin/env perl use constant LINES => 2; my @buffer = (); while (<>) { /pattern/ and unshift @buffer, "\n"; push @buffer, $_; print splice @buffer, 0, -LINES; } continue { if (eof(ARGV)) { print @buffer; @buffer = (); } } 

Просто:

 sed '1{x;d};$H;/regexp/{x;s/^/\n/;b};x' 

Опишите это

 #!/bin/sed # trick is juggling previous and current line in hold and pattern space 1 { # at firs line x # place first line to hold space d # skip to end and avoid printing } $H # append last line to hold space to force print /regexp/ { # regexp found (in current line - pattern space) x # swap previous and current line between hold and pattern space s/^/\n/ # prepend line break before previous line b # jump at end of script which cause print previous line } x # if regexp does not match just swap previous and current line to print previous one 

Изменить : немного более простая версия.

 sed '$H;/regexp/{x;s/^/\n/;b};x;1d' 
 perl -ne 'END{print @x} push@x,$_; if(@x>2){splice @x,1,0,"\n" if /[[:alpha:]]\d[[:alpha:]]\s?\d[[:alpha:]]\d/;print splice @x,0,-2}' 

Если я положу свой файл в это, я получу то, что вы хотите … это уродливо, но вы хотели бы оболочку (то есть однострочный) 🙂 Если бы я сделал это в полном объеме, я смог бы очистить это очень много, чтобы сделать его доступным для чтения. 🙂

Вот подход, который работает для Python.

 import sys def address_change( aFile ): address= [] for line in aFile: if regex.match( line ): # end of the address print address[0] print print address[1:] print line address= [] else: address.append( line ) address_change( sys.stdin ) 

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

Я пытался

 sed '/regexp/a\\n' 

но он вставил две новые строки. Если это вас не беспокоит, возьмите его.

echo -e "a \ nb \ nc" | sed '/ ^ a $ / a \ n'

б
с

Изменить: теперь, когда вы указываете, что вам нужно вставить две строки над соответствующим регулярным выражением, предлагаемое регулярное выражение не будет работать.

Я даже не уверен, будет ли это вообще работать с sed, поскольку вам нужно помнить прошлые строки. Звучит как работа для языка более высокого уровня, такого как python или perl 🙂

  • Как отобразить текст в pygame?
  • Извлечение текста из файла PDF с помощью PDFMiner в python?
  • Автоматически читать текст чата от Minecraft
  • Как создать онтологию в python?
  • Создайте ореол вокруг текста в Python, используя PIL?
  • Статистическая модель предложения предложений, например проверка орфографии
  • Как удалить символы, отличные от ASCII, но оставить периоды и пробелы с помощью Python?
  • python считывает строки всего файла и эффективно сохраняет те, которые я хочу в списках
  • Python - лучший язык программирования в мире.