Усовершенствуйте свои навыки работы с командной строкой с помощью этих примеров использования sed

Вы искали другой способ выполнения операций редактирования текста? Вам сюда! Этот учебник поможет вам разобраться с примерами использования потокового редактора sed.

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

Читайте дальше и повышайте свои навыки работы в командной строке!

Предварительные требования

Убедитесь, что у вас есть следующее, чтобы следовать за практическим демонстрационным материалом в этом учебнике:

  • A command line interface (e.g., Terminal on macOS or Linux) – This tutorial uses Ubuntu Linux 20.04, but the commands should work on most popular operating systems.
  • A text editor (e.g., nano, vi, or Sublime Text) – This tutorial uses Nano.

Установка sed на Ubuntu

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

1. Откройте терминал и выполните следующую команду sed, чтобы проверить, установлена ли у вас sed версии.

sed --version

Если sed установлен, вы увидите номер версии sed и некоторую информацию о сборке, как показано ниже.

Verifying sed’s installed version

В противном случае вы увидите сообщение об ошибке ниже, если `sed` не установлен.

Это сообщение об ошибке указывает на то, что команда sed не найдена в переменной среды PATH вашей системы.

Getting an error running sed commands

2. Затем выполните [apt-get update нижеприведенную команду, чтобы обновить и установить sed на вашей системе.

Эта команда получает последнюю информацию о пакетах из настроенных источников пакетов, включая зависимости, файлы и скрипты пакета. Запуск этой команды необходим, чтобы убедиться, что вы устанавливаете последнюю версию `sed` и любые другие необходимые пакеты.

sudo apt-get update -y && sudo apt-get install sed -y
Installing sed on the operating system

3. Наконец, выполните следующую команду, чтобы проверить, установлена ли команда sed на вашей системе.

Эта команда печатает полный путь к исполняемому файлу `sed`, который в этом примере – /usr/bin/sed.

Как только вы установите `sed` и проверите, что он есть в вашем PATH, вы можете использовать sed команду для выполнения различных преобразований и манипуляций с текстом.

which sed
Verifying that the sed command is installed

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

`sed` – популярный потоковый редактор, доступный в большинстве операционных систем Unix-подобных, и одна из самых удобных функций `sed` – это замена строк в текстовом файле.

Ниже приведены некоторые сценарии, но не ограничиваются ими, где замена строк полезна:

  • Обновление списка URL-адресов для отражения нового доменного имени.
  • Изменение идентификаторов продуктов в базе данных или CSV-файле.
  • Форматирование данных для импорта в другую систему и многое другое.

Основный синтаксис использования sed следующий, где:

Placeholder Function
command Controls sed’s behavior.
options Allows you to customize the behavior of the sed command
input_file Specifies the file or text stream that you want to edit. Typically, you can specify a single file or stream, but concatenating multiple files or streams by redirection also works.
output_file Specifies the file that contains the results of your sed command. The file can be new or the same as input_file, depending on how you use sed.
sed command options input_file | output_file

Предположим, у вас есть текстовый файл с именем urls.txt, содержащий список URL-адресов, и вы хотите обновить все URL-адреса для использования нового доменного имени.

1. Выполните команды echo ниже, чтобы создать файл urls.txt в текущем каталоге. Эти команды не выводят результат, а записывают указанные тексты в файл.

echo "http://old-domain.com/page1" > urls.txt && echo "http://old-domain.com/page2" >> urls.txt && echo "http://old-domain.com/page3" >> urls.txt

2. Затем выполните команду cat, чтобы просмотреть содержимое файла urls.txt. cat urls.txt

cat urls.txt

Вывод подтверждает три старых URL-адреса, записанных в файле urls.txt.

Viewing the contents of the urls.txt file

3. Теперь выполните команду ниже, чтобы найти и заменить (s) все вхождения строки old-domain.com на new-domain.com в файле urls.txt.

sed 's/old-domain.com/new-domain.com/' urls.txt

Вы увидите, что URL-адреса в вашем входном файле были обновлены новым доменом, как показано.

Replacing a string in a text file

Замена N-го вхождения строки

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

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

Основный синтаксис для этой команды выглядит следующим образом:

  • pattern – это строка, которую нужно заменить.
  • replacement – это строка, которой нужно заменить.
  • n – is the nth occurrence of the string to replace (e.g., 1=first occurrence, 2=second occurrence…).
sed 's/pattern/replacement/n' input_file

Чтобы увидеть, как заменить n-е вхождение строки, выполните следующие шаги:

Запустите следующую команду echo, чтобы создать строку текста с тремя вхождениями строки quick. Затем команда sed заменяет (s) второе вхождение (2) строки quick на строку fast.

echo "The quick and quick and quick brown fox jumps over the lazy dog" | sed 's/quick/fast/2'

Как видно ниже, только второе вхождение строки quick было заменено строкой fast, в то время как все остальные вхождения остались неизменными.

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

Replacing the nth occurrence of a string

? Обратите внимание, что команда nth считает вхождения строки слева направо. Более того, команда nth работает только с одной строкой текста. Для выполнения замены в нескольких строках используйте другой метод, продемонстрированный в следующем разделе.

Затем выполните следующую команду, чтобы заменить второе вхождение строки quick на fast, игнорируя регистр (i).

Опция i пригодится при работе с текстом с непостоянным написанием.

echo "The Quick and QuiCk and Quick brown fox jumps over the lazy dog" | sed 's/quick/fast/2i'

В выводе ниже второе вхождение слова quick (QuiCk) успешно заменено строкой fast — независимо от регистра букв.

Replacing the nth occurrence of a string while ignoring the letter case

Замена Всех Вхождений Соответствующего Шаблона/Строки

Вместо замены n-го вхождения строки, возможно, вы планируете заменить все его вхождения. Это существенно помогает в вашем плане массового обновления каждого вхождения строки авторского права текущим годом, например.

1. Создайте файл с именем input.txt с следующим содержимым в выбранном вами текстовом редакторе.

This is a quick test.
The quick brown fox jumps over the lazy dog.
Quick, you need to finish this task before it gets too late.

2. Затем выполните следующую команду, чтобы заменить (s) все вхождения слова quick на fast из файла input.txt. После замены изменения записываются в файл output.txt.

sed 's/quick/fast/g' input.txt > output.txt

3. Теперь выполните команду ниже, чтобы просмотреть содержимое файла output.txt и проверить, была ли выполнена замена.

cat output.txt

Вы увидите, что все вхождения слова quick были заменены на fast, как показано ниже. Аналогично команде nth, команда g чувствительна к регистру и заменяет только точные совпадения.

Строка Quick не будет заменена, как показано ниже, но вы можете использовать опцию i для выполнения регистронезависимых замен.

Replacing All the Occurrences of a Matching Pattern/String

Замена Соответствующего Шаблона/Строки на Определенной Линии

Возможно, вы уже знаете, на какой строке вы хотите заменить строку. Зачем заменять все вхождения, если можно заменить строки на конкретных строках? Эта функция полезна при внесении изменений в определенную строку файла или потока данных, оставляя остальные строки без изменений.

Ниже приведен синтаксис замены строки с определенной строки, где n представляет номер строки.

sed 'n s/pattern/replacement/' input_file output_file

1. Создайте файл с именем myfile.txt со следующим содержимым.

test1
test2
test3

2. Затем выполните следующую команду sed, чтобы выполнить следующее:

  • Поиск слова test2 со второй строки (2) файла myfile.txt. Замените (s) слово test2 на test2_changed. Запишите изменения (>) в новый файл с именем myfile_changed.txt.

This command does not provide output to the terminal since the changes are written to a new file. But you will verify the changes in the following step.

sed '2 s/test2/test2_changed/' myfile.txt > myfile_changed.txt

3. Наконец, выполните следующую команду cat, чтобы просмотреть содержимое файла myfile_changed.txt.

cat myfile_changed.txt

Как видите ниже, вторая строка файла myfile.txt была заменена на test2_changed, в то время как все остальные строки остались без изменений.

Verifying the changed string on a specific line

Вывод измененных строк строк исключительно

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

Ниже приведен синтаксис вывода измененных строк исключительно, где:

  • Опция -n сообщает sed подавлять стандартное поведение печати каждой строки.
  • Флаг p указывает sed распечатать вывод команды.
sed -n 's/pattern/replacement/p' input_file output_file

Откройте файл myfile.txt и замените его содержимое на следующее. Обратите внимание, что вторая строка неправильна, так как слово first должно быть заменено на second.

This is the first line of my file.
This is the first line of my file.
This is the third line of my file.

Теперь выполните следующую команду sed, чтобы заменить строку first на second во второй строке (2) файла myfile.txt, но вывести только измененные строки (p).

sed -n '2 s/first/second/p' myfile.txt

Вы увидите вывод измененной второй строки только в вашем терминале, как показано ниже.

Outputting changed lines exclusively

Заключение

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

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

Теперь, почему бы не изучить больше о регулярных выражениях? Регулярные выражения необходимы многим инструментам манипулирования текстом, включая sed. Эти выражения экономят время и уменьшают затраченные усилия. Когда? Во время выполнения сложных операций поиска и замены на больших объемах текста.

Source:
https://adamtheautomator.com/sed-examples/