- Как использовать sed для поиска и замены строки в файлах
- Найти и заменить строку с помощью sed
- Рекурсивный поиск и замена
- Выводы
- How to Use Sed to Find and Replace a String in a File
- sed Find and Replace Syntax
- sed Replace Examples
- Replace First Matched String
- Global Replace
- Match and Replace All Cases
- Ignore Substrings
- Find and Replace Strings With Slashes
- Find and Replace with Regular Expressions
- Reference Found String
- Create a Backup
- Recursive Find and Replace
Как использовать sed для поиска и замены строки в файлах
При работе с текстовыми файлами вам часто нужно искать и заменять строки текста в одном или нескольких файлах.
sed является s Tream ред itor. Он может выполнять базовые операции с текстом над файлами и входными потоками, такими как конвейеры. С помощью sed вы можете искать, находить и заменять, вставлять и удалять слова и строки. Он поддерживает базовые и расширенные регулярные выражения, которые позволяют сопоставлять сложные шаблоны.
В этой статье мы поговорим о том, как найти и заменить строки с помощью sed . Мы также покажем вам, как выполнить рекурсивный поиск и замену.
Найти и заменить строку с помощью sed
Существует несколько версий sed с некоторыми функциональными различиями. macOS использует версию BSD, в то время как большинство дистрибутивов Linux поставляются с предустановленной по умолчанию GNU sed . Мы будем использовать версию GNU.
Общая форма поиска и замены текста с помощью sed имеет следующий вид:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
- -i — По умолчанию sed записывает свой вывод в стандартный вывод. Эта опция указывает sed редактировать файлы на месте. Если указано расширение (например, -i.bak), создается резервная копия исходного файла.
- s — Заменяющая команда, вероятно, наиболее часто используемая команда в sed.
- / / / — Символ-разделитель. Это может быть любой символ, но обычно используется символ косой черты ( / ).
- SEARCH_REGEX — обычная строка или регулярное выражение для поиска.
- REPLACEMENT — строка замены.
- g — Флаг глобальной замены. По умолчанию sed читает файл построчно и изменяет только первое вхождение SEARCH_REGEX в строке. Если указан флаг замены, заменяются все вхождения.
- INPUTFILE — имя файла, для которого вы хотите запустить команду.
Рекомендуется заключать аргумент в кавычки, чтобы метасимволы оболочки не расширялись.
Давайте посмотрим, как мы можем использовать команду sed для поиска и замены текста в файлах некоторыми из наиболее часто используемых параметров и флагов.
В демонстрационных целях мы будем использовать следующий файл:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Если флаг g опущен, заменяется только первый экземпляр строки поиска в каждой строке:
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
С флагом глобальной замены sed заменяет все вхождения шаблона поиска:
123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456
Как вы могли заметить, подстрока foo внутри строки foobar также заменена в предыдущем примере. Если это нежелательное поведение, используйте выражение границы слова ( b ) на обоих концах строки поиска. Это гарантирует, что частичные слова не совпадают.
sed -i 's/bfoob/linux/g' file.txt
123 Foo linux linux linux /bin/bash Ubuntu foobar 456
Чтобы сделать совпадение с шаблоном нечувствительным к регистру, используйте флаг I В приведенном ниже примере мы используем флаги g и I
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Если вы хотите найти и заменить строку, содержащую символ-разделитель ( / ), вам нужно будет использовать обратную косую черту ( ), чтобы избежать косой черты. Например, чтобы заменить /bin/bash на /usr/bin/zsh вы должны использовать
sed -i 's//bin/bash//usr/bin/zsh/g' file.txt
Более простой и понятный вариант — использовать другой символ-разделитель. Большинство людей используют вертикальную полосу ( | ) или двоеточие ( : ) , но вы можете использовать любой другой символ:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
Вы также можете использовать регулярные выражения. Например, чтобы найти все трехзначные числа и заменить их строковым number вы должны использовать:
sed -i 's/b7b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Еще одна полезная функция sed заключается в том, что вы можете использовать символ амперсанда & который соответствует сопоставленному шаблону. Персонаж можно использовать несколько раз.
Например, если вы хотите добавить фигурные скобки <> вокруг каждого трехзначного числа, введите:
Foo foo foo foo /bin/bash demo foobar
И последнее, но не менее важное: всегда рекомендуется делать резервную копию при редактировании файла с помощью sed . Для этого просто укажите расширение файла резервной копии для параметра -i . Например, чтобы отредактировать file.txt и сохранить исходный файл как file.txt.bak вы должны использовать:
sed -i.bak 's/foo/linux/g' file.txt
Чтобы убедиться, что резервная копия создана, выведите список файлов с помощью команды ls :
Рекурсивный поиск и замена
Иногда может потребоваться рекурсивный поиск в каталогах файлов, содержащих строку, и замена строки во всех файлах. Это можно сделать с помощью таких команд, как find или grep для рекурсивного поиска файлов в каталоге и передачи имен файлов в sed .
Следующая команда будет рекурсивно искать файлы в текущем рабочем каталоге и передавать имена файлов в sed .
find . -type f -exec sed -i 's/foo/bar/g' <> +
Чтобы избежать проблем с файлами, содержащими пробелы в своих именах, используйте параметр -print0 , который указывает find напечатать имя файла, за которым следует нулевой символ, и xargs -0 вывод в sed используя xargs -0 :
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Чтобы исключить каталог, используйте параметр -not -path . Например, если вы заменяете строку в локальном репозитории git, чтобы исключить все файлы, начинающиеся с точки ( . ), Используйте:
find . -type f -not -path '*/.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Если вы хотите искать и заменять текст только в файлах с определенным расширением, вы будете использовать:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Другой вариант — использовать команду grep для рекурсивного поиска всех файлов, содержащих шаблон поиска, а затем передать имена файлов в sed :
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Выводы
Хотя это может показаться сложным и сложным, поначалу поиск и замена текста в файлах с помощью sed очень просты.
Чтобы узнать больше о sed команд, опций и флагов, посетить GNU СЭД руководство и Grymoire СЭД учебник .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
How to Use Sed to Find and Replace a String in a File
The sed (stream editor) utility is a line-oriented text parsing and transformation tool. The sed command uses a simple programming language and regular expressions to process text streams and files. The most used feature of the sed command is string substitution.
This guide shows how to use sed to find and replace strings through examples.
- Access to the command line/terminal.
- A text file (this guide provides an example.txt file).
- Basic terminal commands (grab our free cheat sheet).
sed Find and Replace Syntax
The syntax to find and replace text using the sed command is:
The command consists of the following:
- -i tells the sed command to write the results to a file instead of standard output.
- s indicates the substitute command.
- / is the most common delimiter character. The command also accepts other characters as delimiters, which is useful when the string contains forward slashes.
- is the string or regular expression search parameter.
- is the replacement text.
- g is the global replacement flag, which replaces all occurrences of a string instead of just the first.
- is the file where the search and replace happens.
The single quotes help avoid meta-character expansion in the shell.
The BDS version of sed (which includes macOS) does not support case-insensitive matching or file replacement. The command for file replacement looks like this:
Alternatively, install the GNU version of sed on macOS with homebrew:
Run the GNU sed command as follows:
Replace the sed command with gsed to follow the examples below.
sed Replace Examples
The examples from this guide use a sample file to replace strings.
1. Create a sample text file:
2. Add the following contents:
foobarbazfoobarbaz foo bar baz foo bar baz Foo Bar Baz Foo Bar Baz FOO BAR BAZ FOO BAR BAZ /foo/bar/baz /foo/bar/baz
Use the file as input to test the examples below.
Note: For a full sed command tutorial for Linux, check out our sed command Linux guide.
Replace First Matched String
1. To replace the first found instance of the word bar with linux in every line of a file, run:
sed -i 's/bar/linux/' example.txt
2. The -i tag inserts the changes to the example.txt file. Check the file contents with the cat command:
The command replaces the first instance of bar with linux in every line, including substrings. The match is exact, ignoring capitalization variations.
Global Replace
To replace every string match in a file, add the g flag to the script. For example:
sed -i 's/bar/linux/g' example.txt
The command globally replaces every instance of bar with linux in the file.
Match and Replace All Cases
To find and replace all instances of a word and ignore capitalization, use the I parameter:
sed -i 's/bar/linux/gI' example.txt
The command replaces all instances of the word bar in the text, ignoring capitalization.
Ignore Substrings
Add word boundaries ( \b ) to the sed command to ignore substrings when replacing strings in a file. For example:
sed -i 's/\bbar\b/linux/gI' example.txt
Alternatively, change the delimiter to make the command easier to read:
sed -i 's:\bbar\b:linux:gI' example.txt
The command ignores substrings, matching only the whole word.
Find and Replace Strings With Slashes
Escape the forward slash character to find and replace a string with slashes. For example, to replace /foo/bar/baz with /home/kb, use the following syntax:
sed -i 's/\/foo\/bar\/baz/\/home\/kb/g' example.txt
Alternatively, change the delimiter to avoid escaping characters:
sed -i 's:/foo/bar/baz:/home/kb:g' example.txt
Use this syntax to replace paths and other strings with slashes.
Find and Replace with Regular Expressions
The search pattern for the sed command accepts regular expressions, similar to grep regex. For example, to match all capital letters and replace them with 5, use:
The regex pattern helps find all capital letters and replaces them with the number in the file.
Reference Found String
Use the ampersand character ( & ) to reference the found string. For example, to add a forward slash (/) before every instance of foo in a file, use:
Instead of retyping the search parameter, the & sign references the found string.
Create a Backup
To create a backup file before overwriting the existing one, add the .bak parameter to the -i tag.
sed -i.bak 's/foo/FOO/g' example.txt
The command creates a backup ( example.txt.bak ) before overwriting the original. Use this method to keep a copy in the original format and avoid overwriting.
Recursive Find and Replace
Use the find command to search for files and combine it with sed to replace strings in files recursively. For example:
find -name 'example*' -exec sed -i 's/[a-z]/5/gI' <> +
The command finds all files starting with example and executes the sed command on the files. The executed command replaces all letters with 5, ignoring capitalization.
After going through the examples in this guide, you know how to use sed to replace strings in files. The sed command is a powerful text manipulation utility with many advanced features.
Next, check out the awk or gawk command to learn about other text manipulation tools.