Потоковая обработка текста в Linux

LinuxBeginner
Практиковаться сейчас

Введение

Добро пожаловать в лабораторную работу по потоковой обработке текста в Linux. В этой лабораторной работе вы научитесь использовать sed (Stream Editor) — мощную командную утилиту для разбора и преобразования текста. sed используется для выполнения базовых преобразований текста в входном потоке (файле или входных данных из конвейера).

К концу этой лабораторной работы вы сможете:

  • Выполнять базовые замены текста с помощью sed
  • Редактировать файлы на месте с использованием sed
  • Применять глобальные замены по всему файлу
  • Использовать продвинутые методы обработки текста

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

Базовое использование sed и замена текста

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

Сначала убедимся, что sed установлен на нашей системе, выполнив следующую команду:

which sed

Вы должны увидеть вывод, похожий на следующий:

/usr/bin/sed

Это подтверждает, что sed доступен. Если по какой-то причине он не установлен, вы можете установить его с помощью следующих команд:

sudo apt-get update
sudo apt-get install -y sed

Теперь создадим текстовый файл для работы. Мы создадим файл с именем sample.txt в текущем каталоге:

echo "Linux is a powerful operating system." > ~/project/sample.txt
echo "Many users prefer Linux for servers." >> ~/project/sample.txt
echo "Linux has strong security features." >> ~/project/sample.txt

Проверим содержимое нашего нового файла:

cat ~/project/sample.txt

Вы должны увидеть следующее:

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

Теперь используем sed для выполнения базовой замены. Следующая команда заменит первое вхождение "Linux" на "Ubuntu" в каждой строке:

sed 's/Linux/Ubuntu/' ~/project/sample.txt

Вы должны увидеть:

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

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

cat ~/project/sample.txt

Вывод должен по-прежнему показывать "Linux", а не "Ubuntu":

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

Базовый синтаксис замены с использованием sed выглядит следующим образом:

sed 's/pattern/replacement/' filename

Где:

  • s — команда замены
  • pattern — текст, который вы хотите заменить
  • replacement — новый текст
  • filename — входной файл

Попробуем еще один пример. На этот раз заменим "powerful" на "versatile":

sed 's/powerful/versatile/' ~/project/sample.txt

Это должно вывести:

Linux is a versatile operating system.
Many users prefer Linux for servers.
Linux has strong security features.

Редактирование на месте и глобальная замена

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

  1. Редактировать файлы на месте с помощью опции -i
  2. Выполнять глобальные замены с использованием флага g

Редактирование файлов на месте

Для внесения постоянных изменений в файл с использованием sed мы используем опцию -i. Эта опция модифицирует файл напрямую, а не просто выводит результат в терминал.

Изменим наш файл sample.txt, заменив "Linux" на "Ubuntu":

sed -i 's/Linux/Ubuntu/' ~/project/sample.txt

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

cat ~/project/sample.txt

Теперь вы должны увидеть:

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

Изменения были сохранены в файле! Вот в чем сила редактирования файлов на месте с помощью sed.

Глобальная замена

По умолчанию sed заменяет только первое вхождение шаблона в каждой строке. Чтобы заменить все вхождения, мы используем флаг g (global) в конце команды замены.

Создадим новый файл с повторяющимся текстом:

echo "The red car stopped at the red light near the red building." > ~/project/colors.txt

Теперь используем sed без глобального флага, чтобы заменить "red" на "blue":

sed 's/red/blue/' ~/project/colors.txt

Вы должны увидеть:

The blue car stopped at the red light near the red building.

Обратите внимание, что только первое вхождение "red" было заменено на "blue". Теперь используем глобальный флаг:

sed 's/red/blue/g' ~/project/colors.txt

Вывод должен быть следующим:

The blue car stopped at the blue light near the blue building.

Все вхождения "red" были заменены на "blue"!

Применим это к нашему файлу sample.txt. Сначала добавим больше вхождений "Ubuntu":

echo "Ubuntu is great. I use Ubuntu daily for my work with Ubuntu tools." >> ~/project/sample.txt

Теперь заменим все вхождения "Ubuntu" на "Linux" с использованием глобального флага и редактирования файла на месте:

sed -i 's/Ubuntu/Linux/g' ~/project/sample.txt

Проверим изменения:

cat ~/project/sample.txt

Вы должны увидеть:

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Linux is great. I use Linux daily for my work with Linux tools.

Все вхождения "Ubuntu" были заменены на "Linux" в файле.

Создание резервной копии перед редактированием файла на месте

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

sed -i.bak 's/Linux/Ubuntu/g' ~/project/sample.txt

Эта команда:

  1. Создаст резервную копию sample.txt с именем sample.txt.bak
  2. Заменит все вхождения "Linux" на "Ubuntu" в файле sample.txt

Проверим оба файла:

cat ~/project/sample.txt
cat ~/project/sample.txt.bak

Первая команда должна показать, что все "Linux" были заменены на "Ubuntu", в то время как резервный файл должен по-прежнему содержать "Linux".

Расширенные команды sed и сопоставление шаблонов

Теперь, когда мы освоили базовые замены и редактирование файлов на месте с помощью sed, давайте рассмотрим некоторые более продвинутые функции:

  1. Использование различных разделителей
  2. Использование диапазонов адресов для обработки определенных строк
  3. Комбинирование нескольких команд

Использование различных разделителей

До сих пор мы использовали прямой слеш / в качестве разделителя в наших командах замены, но sed позволяет использовать любой символ в качестве разделителя. Это особенно полезно, когда шаблон или заменяемый текст содержат слеши.

Создадим файл с путями к файлам:

echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt

Если мы хотим заменить /usr/local/bin на /opt/bin, использование слешей может сбить с толку:

sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt

Вместо этого мы можем использовать другой разделитель, например #:

sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt

Это гораздо более читаемо! Вывод должен быть таким:

/opt/bin is in the PATH
My config is in /etc/myapp/config.json

Другие распространенные разделители включают |, : и _.

Адресация - обработка определенных строк

sed позволяет нам указать, какие строки должны быть обработаны при замене. Это делается путем добавления адреса перед командой.

Создадим новый файл с пронумерованными строками:

echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt

Чтобы заменить "line" на "row" только в третьей строке:

sed '3 s/line/row/' ~/project/numbered.txt

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

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

Мы также можем указать диапазон строк. Чтобы заменить "line" на "row" в строках от второй до четвертой:

sed '2,4 s/line/row/' ~/project/numbered.txt

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

Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

Другой полезной функцией является возможность выбирать строки на основе шаблона. Например, чтобы заменить "line" на "row" только в строках, содержащих "third" или "fourth":

sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt

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

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

Комбинирование нескольких команд

Мы можем комбинировать несколько команд sed с помощью опции -e или разделяя команды точкой с запятой.

Заменим "first" на "1st", "second" на "2nd" и "third" на "3rd" в одной команде:

sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt

В качестве альтернативы мы можем использовать точки с запятой:

sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

Обе команды должны дать одинаковый вывод:

Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

Теперь сделаем эти изменения постоянными:

sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

И проверим изменения:

cat ~/project/numbered.txt

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

Работа с скриптами sed

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

  1. Организовать несколько команд sed
  2. Добавить комментарии, объясняющие, что делает каждая команда
  3. Повторно использовать одни и те же операции на разных файлах

Создание скрипта sed

Создадим простой скрипт sed, который выполняет несколько преобразований текста:

cat > ~/project/transform.sed << 'EOF'
## Replace "Linux" with "Ubuntu"
s/Linux/Ubuntu/g

## Replace "user" with "developer"
s/user/developer/g

## Replace "system" with "platform"
s/system/platform/g

## Convert "is" to uppercase
s/is/IS/g
EOF

Этот скрипт выполняет четыре замены:

  1. Заменяет все вхождения "Linux" на "Ubuntu"
  2. Заменяет все вхождения "user" на "developer"
  3. Заменяет все вхождения "system" на "platform"
  4. Преобразует все вхождения "is" в заглавные буквы "IS"

Создадим новый файл для тестирования нашего скрипта:

cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

Запуск скрипта sed

Для запуска нашего скрипта sed на тестовом файле мы используем опцию -f:

sed -f ~/project/transform.sed ~/project/test.txt

Вы должны увидеть:

Ubuntu IS a powerful operating platform.
The developer interface IS very customizable.
Many Ubuntu developers prefer the command-line interface.
The platform resources are efficiently managed.

Все замены из нашего скрипта были применены!

Редактирование файла на месте с использованием скрипта

Как и с командами sed в командной строке, мы можем использовать опцию -i для редактирования файла на месте с помощью скрипта:

sed -i -f ~/project/transform.sed ~/project/test.txt

Проверим изменения:

cat ~/project/test.txt

Теперь файл должен содержать преобразованный текст.

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

И снова, мы можем создать резервную копию перед внесением изменений:

## First, let's restore the original content
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

## Now run sed with a backup
sed -i.bak -f ~/project/transform.sed ~/project/test.txt

Проверим как измененный файл, так и резервную копию:

cat ~/project/test.txt
cat ~/project/test.txt.bak

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

Применение скрипта sed к нескольким файлам

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

Создадим еще несколько тестовых файлов:

## Create test1.txt
cat > ~/project/test1.txt << 'EOF'
Linux offers excellent system performance.
Many users appreciate its stability.
EOF

## Create test2.txt
cat > ~/project/test2.txt << 'EOF'
The Linux community provides great support.
New users can find helpful resources online.
EOF

## Create test3.txt
cat > ~/project/test3.txt << 'EOF'
The system updates are well-managed in Linux.
Users can customize their experience.
EOF

Теперь применим наш скрипт sed к всем этим файлам сразу:

sed -i -f ~/project/transform.sed ~/project/test1.txt ~/project/test2.txt ~/project/test3.txt

Проверим изменения:

cat ~/project/test1.txt
cat ~/project/test2.txt
cat ~/project/test3.txt

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

Это демонстрирует мощь скриптов sed для пакетной обработки нескольких файлов с использованием одного и того же набора преобразований.

Резюме

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

  • Базовая замена текста с использованием команды s
  • Редактирование файла на месте с помощью опции -i
  • Глобальная замена с использованием флага g
  • Создание резервных копий перед редактированием с помощью опции -i.bak
  • Использование различных разделителей для шаблонов замены
  • Обработка определенных строк с использованием адресов и диапазонов
  • Создание и запуск скриптов sed для более сложных операций
  • Применение преобразований сразу к нескольким файлам

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

По мере дальнейшей работы с Linux вы обнаружите, что sed является незаменимым инструментом в вашем арсенале для обработки текста, наряду с другими утилитами, такими как grep, awk и cut.