ДвернаÑ? охота (Выломаные двери)
Оглавление:
Довольно часто при работе с текстовыми файлами вам нужно находить и заменять строки текста в одном или нескольких файлах.
Sed - это лучшая идея. Он может выполнять основные операции с текстом над файлами и входными потоками, такими как конвейеры. С помощью
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
для поиска и замены текста в файлах с некоторыми из его наиболее часто используемых опций и флагов.
В демонстрационных целях мы будем использовать следующий файл:
file.txt
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
С помощью флага глобальной замены
sed
заменяет все вхождения шаблона поиска:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456
Как вы могли заметить, в предыдущем примере подстрока
foo
внутри строки
foobar
также заменяется. Если это не желаемое поведение, используйте выражение «boundery» (
\b
) на обоих концах строки поиска. Это гарантирует, что отдельные слова не совпадают.
sed -i 's/\bfoo\b/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
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
Вы также можете использовать регулярные выражения. Например, чтобы найти все 3-значные числа и заменить их строковым
number
вы используете:
sed -i 's/\b\{3}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Еще одна полезная функция sed - это то, что вы можете использовать символ амперсанда, который соответствует подобному шаблону. Символ может быть использован несколько раз.
Например, если вы хотите добавить фигурные скобки
{}
вокруг каждого трехзначного числа, введите:
sed -i 's/\b\{3}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
И последнее, но не менее важное: всегда полезно сделать резервную копию при редактировании файла с помощью
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 sed и учебнику по Grymoire. Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Найти и заменить текст в нескольких файлах навалом в Windows
Найти и заменить инструмент поможет вам найти и заменить текст несколькими файлов навалом. Просто введите текст и нажмите «Заменить», чтобы немедленно заменить текст.
Заменить командную строку с помощью PowerShell в меню WinX
Это сообщение покажет вам, как отображать Command Prompt или PowerShell, включая Admin , в Windows 10 / 8.1 WinX Power Menu, когда вы щелкните правой кнопкой мыши на Start.
Как использовать Facebook найти Wi-Fi, чтобы найти бесплатные точки доступа
Вот краткое руководство по новой функции Facebook Find WiFi, чтобы найти бесплатные точки доступа. Проверьте это!