Общие сведения о редакторе потоков

Завершено

Редактор потоков (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 мы проверим количество, чтобы убедиться в замене всех вхождений.

  1. Откройте файл NASA-software-API.txt в редакторе Cloud Shell:

    code NASA-software-API.txt
    
  2. Откройте поле поиска для интегрированного редактора и введите строку NASA.

    Результат в поле поиска показывает 27 совпадений для сокращения "NASA".

    Совет

    Чтобы уменьшить объем пространства, используемого редактором Cloud Shell, можно использовать разделитель содержимого, который отделяет редактор от терминала. Если вы внесете эту корректировку, в терминале будет больше места для просмотра выходных данных команды.

  3. Теперь выполните команду sed, чтобы выполнить замену:

    sed 's/NASA/National Aerospace Agency/' NASA-software-API.txt
    

    Обратите внимание, что подстановка выполняется для всех совпадений для "NASA", но команда выводит все строки файла в терминал (stdout). Это поведение используется по умолчанию для инструмента sed.

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

  4. Выполните команду sed еще раз и выведите только те строки, в которых применяется замена шаблона:

    sed -n 's/NASA/National Aerospace Agency/p' NASA-software-API.txt
    

    На этот раз мы видим меньше выходных данных, так как мы использовали флаг -n и параметр p.

Запись в файл

Одним из самых распространенных способов использования средства sed является регистрация результатов синтаксического анализа или операции редактирования. В предыдущих примерах мы были ограничены в нашей способности проверять результаты команды. Мы могли видеть только выходные данные команды, отображаемые в терминале.

Существует еще один флаг, который можно использовать после третьего разделителя в команде sed для разрешения этой проблемы. Флаг w позволяет указывать файл для получения измененных данных из команды.

Попробуем выполнить предыдущую команду еще раз. На этот раз мы запишем все содержимое, измененное командой sed, в новый файл.

  1. Выполните команду sed, чтобы вывести только замененные строки, и отправьте измененные данные в новый файл, например NASA-replaced.txt:

    sed -n 's/NASA/National Aerospace Agency/w NASA-replaced.txt' NASA-software-API.txt
    
  2. Выполните ls, чтобы просмотреть новый файл в каталоге.

    file1    file2    NASA-logs-1995.txt    NASA-replaced.txt    NASA-software-API.txt
    
  3. Откройте новый файл в редакторе Cloud Shell.

    В новом файле должно появиться 26 строк содержимого.

Задача

Если вы используете поле поиска для поиска строки "NASA" в новом файле, вы заметите одно оставшееся вхождение сокращения. Наш вызов к команде sed сделал только 26 подстановок.

Одна строка в файле NASA-software-API.txt имела два вхождения сокращения "NASA". Наш вызов к команде sed успешно заменил только первое вхождение. Второе вхождение "NASA" присутствует в термине "NASAViz".

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