Android

Как использовать sed, чтобы найти и заменить строку в файлах

ДвернаÑ? охота (Выломаные двери)

ДвернаÑ? охота (Выломаные двери)

Оглавление:

Anonim

Довольно часто при работе с текстовыми файлами вам нужно находить и заменять строки текста в одном или нескольких файлах.

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

file.txt file.txt.bak

Рекурсивный поиск и замена

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

Sed Terminal