Введение
Добро пожаловать в лабораторную работу по потоковой обработке текста в 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 для базовых замен текста, но изменения отображались только на экране и не сохранялись в файле. В этом шаге мы научимся:
- Редактировать файлы на месте с помощью опции
-i - Выполнять глобальные замены с использованием флага
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
Эта команда:
- Создаст резервную копию
sample.txtс именемsample.txt.bak - Заменит все вхождения "Linux" на "Ubuntu" в файле
sample.txt
Проверим оба файла:
cat ~/project/sample.txt
cat ~/project/sample.txt.bak
Первая команда должна показать, что все "Linux" были заменены на "Ubuntu", в то время как резервный файл должен по-прежнему содержать "Linux".
Расширенные команды sed и сопоставление шаблонов
Теперь, когда мы освоили базовые замены и редактирование файлов на месте с помощью sed, давайте рассмотрим некоторые более продвинутые функции:
- Использование различных разделителей
- Использование диапазонов адресов для обработки определенных строк
- Комбинирование нескольких команд
Использование различных разделителей
До сих пор мы использовали прямой слеш / в качестве разделителя в наших командах замены, но 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. Это позволяет нам:
- Организовать несколько команд
sed - Добавить комментарии, объясняющие, что делает каждая команда
- Повторно использовать одни и те же операции на разных файлах
Создание скрипта 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
Этот скрипт выполняет четыре замены:
- Заменяет все вхождения "Linux" на "Ubuntu"
- Заменяет все вхождения "user" на "developer"
- Заменяет все вхождения "system" на "platform"
- Преобразует все вхождения "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.



