Многие при работе с UNIX® останавливаются на Emacs, vi или других вариантах и модификациях этих двух текстовых редакторов. Файлы правильно открываются в выбранном редакторе, а изменения интерактивно задаются и вносятся в файл оператором.
Но, зачастую, вы можете редактировать в командной строке быстрее, чем при открытии файла в текстовом редакторе. Операция редактирования может быть запрограммирована и задаваться из командной строки для многочисленных файлов, исключив открытие ненужных окон, лишние движения курсором и другие бесполезные действия. Разумно, чтобы релевантные однострочные редакторы всегда были под рукой. Они не только экономят ваше время при групповых операция с многочисленными файлами, но их также можно использовать в сценариях.
Однострочные редакторы для работы с текстом использовались в языках программирования (Perl и AWK - позже Ruby) и, конечно, в командном процессоре. Это статья описывает три наиболее известные техники использования инструментов редактирования в командной строке, доступные практически для всех систем:
cat
,
ed
и
sed
. Последующие примеры редактирования показаны от простого к сложному.
Используйте
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-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 > file This line is numbered And so is this Another numbered line Ctrl-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
эффективно используется в сценариях. Задайте операцию в этом формате:
[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
(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
.
Научиться
- Оригинал статьи
Save time with text editing one-liners.
-
Прочитайте руководства по AIX 5L 5.3:
-
"
Обработка текста в UNIX
": Эта стать показывает, как использовать
sedнаряду с другими инструментами командной строки для качественной обработки текста. -
"
Говоря о UNIX, Часть 1: Управление командной строкой
": Обучитесь работать с переадресацией и потоками в командном процессоре.
-
Статьи Теодора Златанова (Teodor Zlatanov) Cultured Perl показала особенности однострочников Perl. Прочитайте эти статьи "
Однострочники 101
" (developerWorks, апрель 2001) и "
Однострочники 102
" (developerWorks, март 2003).
-
IBM System p
™
и информационный центр AIX Information Center
: Посетите сайт с документацией по AIX и System p.
-
AIX 5L
™
Wiki
: материалы по AIX в энциклопедии Wiki.
-
Safari книжный магазин
: Посетите ссылку библиотеки, чтобы найти определенные технические ресурсы.
Получить продукты и технологии
-
IBM пробное программное обеспечение: Сделайте вашу новую разработку с программным обеспечением, которое можно загрузить прямо с developerworks.
Обсудить

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