Общие сведения о редакторе потоков
Редактор потоков (sed
) — это полезный инструмент для анализа и обработки текста. Его можно использовать для преобразований текста, поступающего из стандартного входного потока или файла. Средство sed
изменяет текст построчно и не в интерактивном режиме. Таким образом, вы сами принимаете решения при вызове команды. Эти направления выполняются автоматически. Благодаря этой возможности sed
является мощным и быстрым средством для преобразования текста.
Базовое использование
Средство sed
работает с текстом из stdin
или из файла. Такое поведение позволяет отправлять выходные данные другой команды непосредственно в средство sed
для редактирования. Вы также можете работать с ранее созданным или измененным файлом.
Помните, что команда sed
по умолчанию выводит все данные в stdout
. Если вы хотите сохранить измененный текст, необходимо перенаправить выходные данные с помощью оператора перенаправления (>
), как мы делали с командой cat
.
Базовое использование sed
— sed [options] commands [file-to-edit]
.
Попробуйте выполнить эту базовую команду
sed
с файлом NASA-software-API.txt:sed '' NASA-software-API.txt
Команда выводит содержимое файла в stdout
так же, как и команда cat
. Одинарными кавычками помечены инструкции по редактированию для команды sed
. В этом случае мы не передали инструкции по редактированию, поэтому команда вывела каждую строку, полученную в терминале.
Средство sed
может работать с входными данными из stdin
, а не с файлами, а также позволяет сохранять выходные данные из команды.
Подстановка текста с помощью sed
Подстановка текста — это, пожалуй, самый известный вариант использования средства sed
. Как мы узнали ранее, команда sed
может искать тестовые шаблоны с помощью регулярных выражений. Но средство также может заменить совпадающий текст другим.
Общий синтаксис подстановки текста — sed s'/old_text/new_text/'
, где s
— это инструкция по редактированию, которая означает подстановку, а символы косой черты (/
) отделяют текст, используемый в подстановке.
Представим, что у вас есть URL-адрес https://www.nasa.gov/about/sites/index.html
и вы хотите заменить часть index.html
URL-адреса текстом home
.
Эту замену можно выполнить с помощью следующей команды
sed
:echo "https://www.nasa.gov/about/sites/index.html" | sed s'/index.html/home/'
В потоке вывода отображается измененный URL-адрес.
https://www.nasa.gov/about/sites/home
Давайте попробуем выполнить некоторые операции подстановки с содержимым в файле NASA-software-API.txt.
Мы заменим все вхождения сокращения "NASA" полным названием "National Aerospace Agency". Прежде чем сделать подстановку, мы получим количество вхождений сокращения "NASA". После запуска средства sed
мы проверим количество, чтобы убедиться в замене всех вхождений.
Откройте файл NASA-software-API.txt в редакторе Cloud Shell:
code NASA-software-API.txt
Откройте поле поиска для интегрированного редактора и введите строку
NASA
.Результат в поле поиска показывает 27 совпадений для сокращения "NASA".
Совет
Чтобы уменьшить объем пространства, используемого редактором Cloud Shell, можно использовать разделитель содержимого, который отделяет редактор от терминала. Если вы внесете эту корректировку, в терминале будет больше места для просмотра выходных данных команды.
Теперь выполните команду
sed
, чтобы выполнить замену:sed 's/NASA/National Aerospace Agency/' NASA-software-API.txt
Обратите внимание, что подстановка выполняется для всех совпадений для "NASA", но команда выводит все строки файла в терминал (
stdout
). Это поведение используется по умолчанию для инструментаsed
.Чтобы вывести только строки, в которых была применена замена, можно использовать флаг
-n
. Мы также передадим параметрp
в инструкциях по редактированию, чтобы отключить автоматический вывод.Выполните команду
sed
еще раз и выведите только те строки, в которых применяется замена шаблона:sed -n 's/NASA/National Aerospace Agency/p' NASA-software-API.txt
На этот раз мы видим меньше выходных данных, так как мы использовали флаг
-n
и параметрp
.
Запись в файл
Одним из самых распространенных способов использования средства sed
является регистрация результатов синтаксического анализа или операции редактирования. В предыдущих примерах мы были ограничены в нашей способности проверять результаты команды. Мы могли видеть только выходные данные команды, отображаемые в терминале.
Существует еще один флаг, который можно использовать после третьего разделителя в команде sed
для разрешения этой проблемы. Флаг w
позволяет указывать файл для получения измененных данных из команды.
Попробуем выполнить предыдущую команду еще раз. На этот раз мы запишем все содержимое, измененное командой sed
, в новый файл.
Выполните команду
sed
, чтобы вывести только замененные строки, и отправьте измененные данные в новый файл, например NASA-replaced.txt:sed -n 's/NASA/National Aerospace Agency/w NASA-replaced.txt' NASA-software-API.txt
Выполните
ls
, чтобы просмотреть новый файл в каталоге.file1 file2 NASA-logs-1995.txt NASA-replaced.txt NASA-software-API.txt
Откройте новый файл в редакторе Cloud Shell.
В новом файле должно появиться 26 строк содержимого.
Задача
Если вы используете поле поиска для поиска строки "NASA" в новом файле, вы заметите одно оставшееся вхождение сокращения. Наш вызов к команде sed
сделал только 26 подстановок.
Одна строка в файле NASA-software-API.txt имела два вхождения сокращения "NASA". Наш вызов к команде sed
успешно заменил только первое вхождение. Второе вхождение "NASA" присутствует в термине "NASAViz".
Можете ли вы воспользоваться рассмотренными командами, чтобы сделать такую последнюю замену?