Как я использую команду 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
для обработки текстовых файлов.