Экономьте время с однострочными редакторами текста

Примеры быстрого редактирования с использованием cat, ed и sed

Взгляните на один из наиболее эффективных однострочных редакторов. Операции редактирования выполняются интерактивно внутри приложения текстового редактора. Некоторые задачи можно выполнить быстро и легко, прямо из командной строки UNIX(R).

Майкл Штатц, автор, консультант

Фото Майкла ШтатцаМайкл Штатц (Michael Stutz) - автор Справочника по Linux (The Linux Cookbook) , который он разработал, используя только открытые программные средства. Он заинтересован в цифровой публикации книги и ее дальнейшем использовании. В течение 20 лет он использовал разные операционные системы UNIX. Вы можете найти Майкла на stutz@dsl.org.



09.03.2007

Введение

Многие при работе с UNIX® останавливаются на Emacs, vi или других вариантах и модификациях этих двух текстовых редакторов. Файлы правильно открываются в выбранном редакторе, а изменения интерактивно задаются и вносятся в файл оператором.

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

Однострочные редакторы для работы с текстом использовались в языках программирования (Perl и AWK - позже Ruby) и, конечно, в командном процессоре. Это статья описывает три наиболее известные техники использования инструментов редактирования в командной строке, доступные практически для всех систем: cat , ed и sed . Последующие примеры редактирования показаны от простого к сложному.

Редактирование с cat

Используйте cat , который связывает как файлы, так и простые входные потоки, как показано в листинге 1 . Лентяи также используют его как пейджер ( cat file ) и среду текстового редактирования ( cat > file ). Этот синтаксис очень прост, и для однострочников он позволяет добавлять и вставлять текст без редактора.

Листинг 1. Использование cat для соединения файлов и простых входных путей
  $ (cat - input1 - input2 - input3 - input4 ) | mailx ted Ted, 
  
  Взгляните на эти примеры. 
  
  Это первый файл ... 
  Ctrl-D 
  
  Это второй файл ... 
  Ctrl-D 
  
  Это третий файл -- обратите внимание на 4 параграф далее ... 
  Ctrl-D 
  
  А вот и последний файл ... 
  Ctrl-D 
  $

Добавьте текст в конце файла

Даже лентяи это уже поняли. Когда нужно добавить текст в конец файла, нет ничего лучше и быстрее, чем cat:

  $ 
  cat >>file 
  > line 
  > line 
  > line
Ctrl-D $

Добавляя строки, нажмите Ctrl-U, чтобы удалить текущую строку, Ctrl-Z - приостановить операцию и Ctrl-C - прервать все задачи. Закончив, нажмите Ctrl-D. (Это, заданные по умолчанию, кнопки управления командного процессора Korn, но они работают почти во всех командных процессорах и режимах редактирования).

Если вводимые - это выделенный в окне текст, то однострочник сработает гораздо быстрее, нежели вызов редактора, открытие самого файла, прокручивание в конец файла, вставка выбранного фрагмента, сохранение файла, выход из редактора. Еще более полезным он может быть, если вы вставляете форматированный или специально форматированный текст и хотите сохранить форматирование, тогда как некоторые редакторы и режимы редактирования переформатируют выделенный в окне текст при вставке.

Хотя такая операция повседневна, нужно быть осторожным и помнить, что вы используете оператор командного процессора (shell operator) для добавления переадресации ( >> ) а не обычный оператор переадресации ( > ); если ошибочно используете последний, вы перезапишете содержимое файла, в который хотели добавить текст.

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

  $ 
  cat footnotes.txt >> file

Если вы добавляете одну строку вместо многих строк или целый файл, вы можете использовать echo вместо cat:

  $ 
  echo "192.255.255.255 bigblue" >> /etc/hosts

Чтобы добавить строки, пронумерованные, начиная с 1, используйте cat с опцией -n; в строки добавляется номер (отступ около пяти символов) и символ табуляции. Добавьте опцию -b для того, чтобы не нумеровать пустые строки:

  $ 
  cat -nb > fileThis line is numberedAnd so is thisAnother numbered lineCtrl-D 
  $ 
cat file 
  1 This line is numbered 
  2 And so is this
 
  3 Another numbered line 
  $

Вставьте текст в начало файла

Вы можете вставить текст в начало файла с cat, определяя ввод с помощью тире ( - ) и записав в новый файл:

  $ 
 
  cat - file > newfile
  This is the beginning of the file
  And then the old file is inserted
  Below this line:

  Ctrl-D
  $

Хоть это и просто, недостатком этого однострочника является то, что он создает новый файл. Если вы хотите вставить текст в первоначальный файл, переименование приведет к существенным проблемам. Лучше использовать ed .

Отображение непечатаемых символов

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

  $ 
  cat -vet input.txt 
  This line has trailing blanks.    $ 
  This line does not.$
  $

Эти опции отличаются в зависимости от реализации UNIX; в таблице 1 показыны стандартные IBM AIX ® опции операционной системы.

Таблица 1. Опции для контроля ввода в AIX cat
ОпцияОписание
-bНе нумерует пустые строки.
-e Показывает конец строки знаком $.
-nНумерует все строки ввода, начиная с 1.
-qИспользует "тихие" операции (запрещает вывод сообщений об ошибках).
-rЗаменяет все пустые строки одной строкой ("сжимает" пробелы).
-S Сжимает все пустые строки в одну строку (также как -r ).
-sЗапрещает вывод сообщений об ошибках ("тихие" операции).
-t Показывает знаки табуляции как ^I.
-uНе буферизует ввод.
-vДелает видимыми непечатаемые управляющие символы.

Редактируйте с помощью ed

Как и подразумевает его название, редактор строк, ed , редактирует строки входного файла. Он проверяет файлы в собственном буфере, делает заданные операции с копией, и записывает буфер на диск. Вы можете задать любое количество строк в процессе редактирования, эти операции могут комбинироваться и выполняться последовательно. Благодаря этому, ed эффективно используется в сценариях. Задайте операцию в этом формате:

[address]command [text]

Адрес задает строку или строки для работы (по умолчанию - текущая строка), он может быть присвоен несколькими способами. Команда работает с заданными строками. Для сопряжения однострочников в сценариях ed используется не интерактивно, объединяя группу команд посредством каналов и текст к ней с помощью echo:

( echo 'OPERATION'; echo 'OPERATION'; ... echo 'wq' ) | ed -s FILENAME

Если текст будет введен в операцию, для определения окончания ввода используются повторяющиеся точки (.). Команда wq производит запись в файл и выход. Опция -s способствует тому, что ed скрывает вывод при нормальном завершении.

К счастью, в ed базовые методы и команды адресации стандартизированы. Основные формы адресации показаны в таблице 2 . Команды показаны в таблице 3 .

Таблица 2. Адресация строк в ed
ОпцияОписание
.Эта опция обращается к текущей строке (адрес по умолчанию).
номер Эта опция обращается к номеру строки. К строкам можно обращаться в диапазоне, разделенном запятой ( первая , последняя ). 0 означает начало буфера (перед первой строкой).
- number Эта опция обращается к количеству строк перед текущей строкой. Без number минус обращается к строке перед текущей.
+ number Эта опция обращается к количеству строк после текущей строки. Без number плюс обращается к строке после текущей.
$Эта опция обращается к последней строке.
, Эта опция обращается к строкам от первой до последней, включительно (также как 1,$ ).
;Эта опция обращается к строкам от текущей до последней.
/ pattern / Эта опция обращается к следующей строке, содержащей текст согласно pattern (шаблону) .
? pattern ? Эта опция обращается к предыдущей строке, содержащей текст согласно pattern (шаблону) .
Таблица 3. Основные ed команды
КомандаОписание
aЭта команда добавляет текст после определенного адреса.
cЭта команда изменяет заданный адрес данного текста.
dЭта команда удаляет заданные строки.
iЭта команда вставляет текст перед определенным адресом.
qЭта команда позволяет выйти из программы, как только буфер будет сохранен на диск.
r file Эта команда читает содержимое указанного файла и вставляет его после определенного адреса.
s/ pattern / replacement / Эта команда заменяет текст, совпадающий с pattern (шаблоном), на replacement (замещающий) текст по указанному адресу.
w file Эта команда прописывает и определяет адрес файла . Без адреса команда использует адрес из буфера.

Вставьте текст в начало файла, второй способ

Вы можете легко вставить текст в начало файла со сценарием ed однострочника. Вставка осуществляется с помощью ed, добавляя данный текст в строку 0 (начало файла), с помощью команды a:

  $ 
  cat file 
  This is the end. $ 
  (echo '0a'; echo 'This is the beginning.'; echo '.'; echo 'wq') | ed -s file 
  $ 
  cat file 
  This is the beginning.
  This is the end. $

Вы можете делать то же самое интерактивно:

  $ 
  cat file 
  This is the end.  $ 
   ed -s file 
  >  0a 
  >  This is the beginning. 
  >  . 
  >  wq 
  $  cat file 
  This is the beginning. 
   This is the end. $

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

  $  (echo '0r headnotes'; echo 'wq') | ed file

Вставьте текст после данной строки

Вы можете использовать ed, чтобы вставить любое количество строк перед или после любой строки файла. Чтобы вставить после первой строки, содержащей данную подстроку, заключите строку в скобки и выполните команду a, чтобы вставить следующий текст. Как и ранее, закончите строку многоточием, и используйте wq, чтобы записать файл и выйти.

Эта техника эффективна, если вы хотите добавить текст в определенное место файла:

  $   ( echo '/begin/a'; echo ' This is the middle.'; \ 
  >   echo '.'; echo 'wq') | ed -s file 
  $   cat file 
  This is the beginning.
  This is the middle.
  This is the end.
 $

Это также полезно, если вы хотите вставить текст, состоящий из большого количества строк, в группу файлов. Если вам нужно вставить много строк, используйте here document - inline-документ, определенный знаком << и ограниченный строкой, переадресовывает все введенное до граничной строки (смотрите Ресурсы ):

 $ for i in *.xml
> { ed -s $i << EOF
> /<records>/a \
> <record> \
>   <name>johnnycomelately</name> \
>   <step>10</step> \
>   <dur>4</dur> \
> </record>\
> .
> wq
> EOF
> }
$

Вы можете вставить файл после данной строки:

$ (echo '/END OF PART I/r footnotes.txt'; echo 'wq') | ed file

Удаление строк

Используйте команду d для того, чтобы удалить строки из файла. Как и с другими описанными командами, вы можете задать корректный адрес как обычную строку либо перечень строк. На практике, этот однострочник гораздо более эффективен при использовании совместно с хотя бы одним шаблоном, как, например, удаление строк, начиная с первого совпадения и до конца файла:

$ ( echo '/FOOTNOTES/,$/d'; echo 'wq' ) | ed -s file

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

$ ( echo '1,/\.\.\./d'; echo 'wq' ) | ed -s file

Удаление пробелов в конце строк

Вы можете удалить пробелы в конце строк, используя команду s и заменяя пустые места:

$ cat -vet input.txt

В этой строке есть пробелы в конце.    $
В этой строке - нет.$
$ (echo ',s/ *$//'; echo 'wq') | ed -s input.txt
$ cat -vet input.txt

В этой строке есть пробелы в конце.$
В этой строке - нет.$
$

Редактирование с помощью sed

Наиболее комплексным и эффективным из вышеописанных инструментов редактирования является sed (Stream EDitor). Это текстовый редактор, но в отличие от файловых редакторов, таких как ed , он редактирует входной поток и записывает в выходной поток. Поэтому, он полезен при редактировании вывода команды или, если вы работаете с файлом, используя другие инструменты - вы можете передать текст с помощью канала в sed для быстрого редактирования. sed так же может работать и с файлами, и его язык сценариев имеет усовершенствованные возможности по работе с шаблонами, так что это прекрасный выбор для любых операций быстрого редактирования текстов: быстрый поиск и замена внутри группы файлов. Это один из наиболее известных существующих инструментов командной строки для редактирования текстов.

sed выбирает сценарий с любым количеством команд и последующей спецификацией ввода; по умолчанию, он считывает стандартный ввод. Некоторые версии sed имеют опцию -i, которая определяет, что введенный файл должен быть отредактирован. Без опции, введенный файл считывается, но не записывается. Если установленная вами версия поддерживает эту опцию, вы должны использовать ее - это позволит вам провести быстрое редактирование на любой спецификации файлов с помощью одной команды:

  sed -i   script filespec

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

  sed 
  script   file > newfile; mv newfile file

Необходимо склеить несколько файлов:

  for  i in *; { sed   script  $i > $i.new; mv $i.new $i; }

Замена текста в файле

Вы можете использовать конструкцию s/searchstring/replacestring/, чтобы заменить данную строку на другую. Чтобы заменить первое совпадение со старым шаблоном (old), в каждой строке файла, используйте следующее:

$ sed -i 's/old/new/' file

Чтобы заменить каждое совпадение, нажмите g в поиске. Эта техника эффективна для закрепления типографской разметки текста или замены слова, фразы или строки в файле или группе файлов:

$ sed -i 's/Esclipse/Eclipse/g' *.xml

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

$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/[Tt]h/g' file
[Tt]his is [Tt]he beginning.
[Tt]his is [Tt]he middle.
[Tt]his is [Tt]he end.

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

$ sed -i 's,/usr/local/websphere,/usr/websphere,' file

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

$ sed -i 's/.*pattern.*/LINE DELETED/' file

Отредактируйте согласованную комбинацию

Посмотрите, как скобки группируют знаки в комбинацию и как они принимаются в качестве буквенных знаков в заменяемом тексте. Что если вы хотите включить буквенную согласованную комбинацию в заменяемый текст? Вы можете сделать это с помощью амперсанта (&). Этот подход полезен при редактировании согласованной комбинации путем внесения текста перед ней, либо после нее:

$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/>&</g' file
>Th<is is >th<e beginning.
>Th<is is >th<e middle.
>Th<is is >th<e end.

Вставьте текст по соответствующему шаблону

Используйте команду a, чтобы добавить строку текста после данной согласованной комбинации:

$ sed -i '/pattern/a text' file

Это не будет заменять текст, совпадающий с комбинацией - это лишь добавит текст после строки, которая будет содержать комбинацию.

Добавление текста в начале строк

Чтобы вставить текст в начале каждой строки, добавьте метасимвол вставки и выберите текст для вставки. Вот так, например, можно добавить e-mail всем строкам файла:

  $ 
  sed 's/^/> /' input.txt 
 > This line has trailing blanks.       
 > This line does not.

Вставка текста в конце строк

Такой же принцип и для вставки текста в конце строки - выберите метасимвол доллара и текст для вставки. Вот как можно копировать в AIX опцию -vet для cat для обозначения пробелов в конце строк:

$ sed 's/$/$/' file
This line has trailing blanks.   $
This line does not.$
$

Удаление строк из файла

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

Чтобы удалить первую строку файла:

$ sed -i 1d file

Чтобы удалить строки от 1 до 10:

  $  sed -i 1,10d file

Чтобы удалить все строки между "ОТКРЫВАЮЩЕЙ КАВЫЧКОЙ" и "ЗАКРЫВАЮЩЕЙ КАВЫЧКОЙ":

$ sed -i '/BEGIN QUOTE/,/END QUOTE/d' file

Чтобы удалить все элементы, первая строка которых содержит "<record>" и последняя строка содержит "</record>" во всех файлах с расширением .xml и в текущей директории:

$ sed -i '/<record>/,/<\/record>/d' *.xml

Чтобы удалить от первой строки до первой пустой строки:

  $   sed -i '/^> /d' file

( При использовании для e-mail сообщений или статей Usenet, предыдущий однострочник стирает все заголовки.)

Чтобы удалить все строки, начинающиеся с ссылок e-mail:

  $   sed -i /^$/d file

Чтобы удалить последнюю строку файла:

$ sed -i '$d' file

Удаление пробелов в конце строк

Если строки содержат знаки пробелов в конце, эти знаки нужно убрать. Достаточно сложно вручную находить и удалять их в текстовом редакторе - но с помощью sed сделать это очень просто. Вы ищете знак пробела, который возникает один или несколько раз перед окончанием строки, и заменяете его пустым местом:

$ cat -vet input.txt

This line has trailing blanks.    $
This line does not.$
$ sed -i 's/ *$//' input.txt
$ cat -vet input.txt

This line has trailing blanks.$
This line does not.$
$

Заключение

Текстовые файлы можно редактировать легким и эффективным способом без редактора, запустив однострочники из командной строки UNIX. Существует много причин, почему вам следует так поступить: для быстроты и удобства, для использования в случаях, где интерактивный редактор невозможно использовать, а иногда для комплексного редактирования файла или группы файлов, которое будет достаточно сложно выполнить в вашем интерактивном приложении. Эта статья продемонстрировала концепцию редактирования с помощью однострочников с использованием трех наиболее удобных инструментов редактирования: cat , ed и sed .

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=201173
ArticleTitle=Экономьте время с однострочными редакторами текста
publish-date=03092007