Поиск по сайту:

Как я использую команду sed в Linux для автоматизации редактирования файлов


Вот несколько советов и рекомендаций по автоматизации редактирования файлов из командной строки Linux.

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

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

Поиск и замена текста в файле в Linux

Чтобы использовать sed, вам необходимо использовать регулярное выражение. Регулярное выражение — это набор специальных символов, определяющих шаблон. Мой наиболее частый пример использования sed — замена текста в файле. Синтаксис замены текста выглядит следующим образом: s/originaltext/newtext/. s сообщает sed выполнить замену текста или местами вхождения текста. Укажите исходный текст и новый текст между косыми чертами.

Этот синтаксис заменит только первое вхождение originaltext в каждой строке. Чтобы заменить каждое вхождение, даже если исходный текст встречается в строке более одного раза, добавьте g в конец выражения. Вот пример: s/originaltext/newtext/g.

Чтобы использовать это с sed, укажите это регулярное выражение с помощью опции -e:

$ sed -e 's/originaltext/newtext/g'

Например, предположим, что у меня есть Makefile для программы под названием game, которая имитирует «Игру жизни» Конвея:

.PHONY: all run clean

all: game

game: game.o
	$(CC) $(CFLAGS) -o game game.o $(LDFLAGS)

run: game
	./game

clean:
	$(RM) *~
	$(RM) *.o
	$(RM) game

Название game не очень информативно, поэтому я могу переименовать его в life. Переименовать исходный файл game.c в life.c достаточно просто, но теперь мне нужно изменить Makefile, чтобы использовать новое имя. Я могу использовать sed, чтобы изменить каждое вхождение game на life:

$ sed -e 's/game/life/g' Makefile
.PHONY: all run clean

all: life

life: life.o
	$(CC) $(CFLAGS) -o life life.o $(LDFLAGS)

run: life
	./life

clean:
	$(RM) *~
	$(RM) *.o
	$(RM) life

При этом вывод sed выводится на экран, что является хорошим способом проверить, приведет ли замена текста к тому, что вы хотите. Чтобы внести эти изменения в Makefile, сначала сделайте резервную копию файла, затем запустите sed и сохраните выходные данные с исходным именем файла:

$ cp Makefile Makefile.old
$ sed -e 's/game/life/g' Makefile.old > Makefile

Если вы уверены, что ваши изменения — именно то, что вам нужно, используйте параметр -i или --in-place, чтобы редактировать файл на месте. Однако я рекомендую добавить суффикс имени резервного файла, например --in-place=.old, чтобы сохранить копию исходного файла на случай, если вам понадобится восстановить его позже. Это выглядит так:

$ sed --in-place=.old -e 's/game/life/g' Makefile
$ ls Makefile*
Makefile  Makefile.old

Цитирование файлов с помощью sed в Linux

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

Один из способов использования «начала строки» для замены текста — это когда мне нужно процитировать файл в электронном письме. Допустим, я хочу поделиться своим Makefile по электронной почте, но не хочу включать его в качестве вложения. Вместо этого я предпочитаю «цитировать» файл в теле письма, используя > перед каждой строкой. Я могу использовать следующую команду sed, чтобы распечатать отредактированную версию на своем терминале, которую я могу скопировать и вставить в новое электронное письмо:

$ sed -e 's/^/>/' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>	$(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>	./life
>
>clean:
>	$(RM) *~
>	$(RM) *.o
>	$(RM) life

Регулярное выражение s/^/>/ соответствует началу каждой строки (^) и помещает туда >. По сути, каждая строка начинается с символа >.

Табуляции могут отображаться в электронном письме неправильно, но я могу заменить все табуляции в Makefile несколькими пробелами, добавив другое регулярное выражение:

$ sed -e 's/^/>/' -e 's/\t/  /g' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>  ./life
>
>clean:
>  $(RM) *~
>  $(RM) *.o
>  $(RM) life

\t указывает на буквальную табуляцию, поэтому s/\t/ /g сообщает sed заменить все табуляции во входных данных двумя пробелами в выходных данных.

Если вам нужно внести множество изменений в файлы, вы можете сохранить команды -e в файле и использовать -f, чтобы сообщить sed используйте этот файл как «скрипт». Этот подход особенно полезен, если вам нужно часто вносить одни и те же изменения. Я мог бы подготовить Makefile для цитирования по электронной почте, используя файл сценария quotemail.sed:

$ cat quotemail.sed
s/^/>/
s/\t/  /g
$ sed -f quotemail.sed Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>  ./life
>
>clean:
>  $(RM) *~
>  $(RM) *.o
>  $(RM) life

Научитесь работать с sed в Linux

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

Статьи по данной тематике: