Куда идет ожидание сети в «вершине»?

Этот тип диапазона является идеальным вариантом использования для например . Я довольно много писал о ex на этом сайте; это лучший инструмент POSIX для редактирования файлов по сценарию.

Команда:

Если требуется обрабатывать только один блок, используйте:

printf '%s\n' '/00 PROGRAM/' '.,/^$/-2d' x | ex file.txt

Если есть потенциально несколько блоков, используйте:

printf '%s\n' 'g/00 PROGRAM/.,/^$/-2d' x | ex file.txt

Для тестирования используйте % p вместо x :

printf '%s\n' '/00 PROGRAM/' '.,/^$/-2d' %p | ex file.txt
printf '%s\n' 'g/00 PROGRAM/.,/^$/-2d' %p | ex file.txt

Это напечатает весь буфер, а не сохраняет его содержимое обратно в файл.


Иллюстрация:

[vagrant@localhost ~]$ cat file.txt 
000-12-22
AB1
00 PROGRAM
01 INQUIRY
03 XYZ
04 XYZ

LINE VALUE
00456
[vagrant@localhost ~]$ printf '%s\n' '/00 PROGRAM/' '.,/^$/-2d' x | ex file.txt 
[vagrant@localhost ~]$ cat file.txt 
000-12-22
AB1
04 XYZ

LINE VALUE
00456
[vagrant@localhost ~]$ 

Объяснение и комментарии:

Вы можете использовать ex -c 'editcommands' filename , но я обнаружил, что это создает больше проблем, чем решает: Если возникает ошибка ] ex не закрывается, но зависает в ожидании ввода данных пользователем. Кроме того, существуют потенциальные проблемы переносимости при передаче нескольких команд в ex таким образом, поскольку общие функции, которые позволяют вам это сделать, не гарантируются POSIX.

Вместо этого я обычно перенаправляю команды на ex из printf .Это позволяет легко разделить несколько команд новой строкой, используя % s \ n в качестве строки формата для printf , и оставляет файл без изменений в случае ошибки без зависания (например, если вы попытаетесь отредактировать строку больше последней строки файла).

Чтобы проверить команду перед фактическим редактированием файла, я использую % p (печать всего буфера) в качестве последней команды. Затем я могу немного подправить команду и запускать ее снова и снова, пока не получу именно то содержимое файла, которое мне нужно. Когда я доволен результатом, я меняю % p на x и запускаю команду еще один раз, чтобы фактически сохранить изменения в файле.

Вот снова команда, которую я дал в качестве ответа на этот вопрос:

printf '%s\n' '/00 PROGRAM/' '.,/^$/-2d' x | ex file.txt

Команда printf просто печатает три строки / 00 PROGRAM / , ., / ^ $ / - 2d и x разделены символами новой строки, например:

[vagrant@localhost ~]$ printf '%s\n' '/00 PROGRAM/' '.,/^$/-2d' x
/00 PROGRAM/
.,/^$/-2d
x
[vagrant@localhost ~]$ 

Эти три строки являются командами ex .

Обзор команд ex

Команда ex состоит из двух частей: адреса (на основе строки) и команды.

Если есть только адрес, курсор переместится на этот адрес (переместится в эту строку).

Если есть только команда, в качестве адреса используется текущая строка.

Адрес часто может быть диапазоном - адресом, за которым следует запятая, за которой следует другой адрес. Это относится ко всем строкам от первого адреса до второго адреса.

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

Вы даже можете написать адрес, означающий: «Две строки до экземпляра foo , который происходит вскоре после экземпляра bar , который непосредственно предшествует текущей строке». Это будет выглядеть так: ? Bar? / Foo / -2

Шаг за шагом

Команда / 00 PROGRAM / - это просто адрес, поэтому она означает «переместите курсор в первый экземпляр шаблона '00 PROGRAM '. "

Команда ., / ^ $ / - 2d состоит из двух частей. d в конце - это команда, означающая «удалить». Остальное - адрес.

Начальный . - это специальный адрес, относящийся к текущей строке.

Шаблон / ^ $ / - это регулярное выражение для пустой строки (начало строки ^ , сразу за которым следует конец строки $ ). В данном случае это означает следующую пустую строку после текущей позиции курсора.

-2 означает «две строки назад».

Все вместе, тогда ., / ^ $ / - 2d означает: «Удалить строки из текущего строка на строку на две строки выше следующей пустой строки. "

x просто означает сохранить содержимое буфера в файл и выйти из редактора.


Надеюсь, вы найдете это полезным. ex - чрезвычайно мощный инструмент для редактирования текста. Это непосредственный предшественник vi , который является «визуальным редактором»."Все команды ex также могут выполняться в vi .

9
13.05.2015, 01:43
0 ответов

Теги

Похожие вопросы