Linux sed замена подстроки

Linux и Android

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

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

В этой статье мы поговорим о том, как находить и заменять строки с помощью sed. Мы также покажем вам, как выполнять рекурсивный поиск и замену.

Существует несколько версий sed, с некоторыми функциональными отличиями между ними. macOS использует версию BSD, а большинство дистрибутивов Linux поставляются с предварительно установленной GNU sed по умолчанию. Мы будем использовать версию GNU.

  • -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

Как вы могли заметить, в предыдущем примере подстрока foo внутри строки foobar также заменяется. Если такое поведение вас не устраивает, используйте выражение «boundery» (\b) на обоих концах строки поиска. Это гарантирует, что отдельные слова не совпадут.

Читайте также:  Linux find socket files

Чтобы сделать сопоставление с шаблоном нечувствительным к регистру, используйте флаг I. В приведенном ниже примере мы используем флаги g и I:

Если вы хотите найти и заменить строку, содержащую символ разделителя (/), вам нужно использовать обратную косую черту (\), чтобы экранировать ее. Например, чтобы заменить /bin/bash на /usr/bin/zsh, вы бы использовали следующую команду:

Более простой и читаемый вариант — использовать другой символ-разделитель. Большинство людей используют вертикальную черту (|) или двоеточие (:), но вы можете использовать любой другой символ:

Вы также можете использовать регулярные выражения. Например, чтобы найти все трехзначные числа и заменить их строкой number:

Еще одна полезная особенность sed — вы можете использовать символ амперсанда &, который соответствует подходящему шаблону. Символ может быть использован несколько раз.

И последнее, но не менее важное: всегда полезно сделать резервную копию при редактировании файла с помощью sed. Для этого просто добавтьте расширение к опции -i. Например, чтобы отредактировать файл file.txt и сохранить исходный файл как file.txt.bak, вы должны ввести:

Иногда вам нужно рекурсивно искать в каталогах файлы, содержащие заданную строку, и заменять эту строку во всех файлах. Это можно сделать с помощью таких команд, как find или grep, для рекурсивного поиска файлов в каталоге и передачи имен файлов в sed.

Следующая команда будет рекурсивно искать файлы в текущем рабочем каталоге и передавать имена файлов в sed.

Чтобы избежать проблем с файлами, содержащими пробел в их именах, используйте опцию -print0, которая указывает find печатать имя файла, с символом null после него, и направлять вывод в sed с помощью xargs -0:

Чтобы исключить каталог, используйте опцию -not -path. Например, если вы заменяете строку в локальном репозитории git, чтобы исключить все файлы, начинающиеся с точки (.), выполните:

Читайте также:  Linux узнать расположение исполняемого файла

Другой вариант — использовать команду grep для рекурсивного поиска всех файлов, содержащих заданный шаблон, а затем передать имена файлов в sed:

Хотя сначала это может показаться сложным, поиск и замена текста в файлах с помощью sed очень просты. Чтобы узнать больше о командах, опциях и флагах sed, почитайте руководство GNU sed и учебник Grymoire sed.

Источник

sed в linux — примеры использования

Утилита sed это мощный потоковый редактор текста с поддержкой регулярных выражений. С помощью sed вы можете заменять шаблоны текста (причем непосредственно в файле!), удалять строки (элементы массива), выводить подходящие по маске строки (подобно grep). Редактор sed поддерживает применение нескольких команд и расширенный синтаксис регулярных выражений (при котором не нужно экранировать спец. символы).

Важно!

В sed нет поддержки опережающих и ретроспективных проверок в регулярках! Для замены с использованием расширенного синтаксиса regex используйте:

find . -type f -name '*.blade.php' -exec perl -p -i -e 's/(? \;
Внимание!

В sed довольно проблемно работать с символом перевода строки! Самое удобное решение — это:

sed [-opt] 's/regex/replace/flag' input-file sed 's/regex/replace/flag' # замена найденных подстрок sed '1,5s/regex/replace/gi' # замена только в указанном диапазоне строк sed -r 's/regex/replace/g' # расширенный синтаксис regex (со спец символами) sed 's/regex//g' # удалить найденные подстроки sed '/regex/d' # удалить строки подходящие по маске sed -n 2p # вывести 2ю строку sed -n '/composer/p' # вывести только строки подходящие по маске sed 's/1-9/&/p' # & при замене означает сам ОБРАЗЕЦ 

В качестве разделителей можно использовать любые символы (напрмиер: # , @ ). Match части (которые внутри круглых скобок) доступны как \1 , \2 , \n .

-p вывести на экран -d удалить -i выполнять изменения непосредственно в файле -n не выводить результат замены/поиска на экран (--quiet, --silent) -e указывает на передачу инструкции (команда замены/удаления или выражение для поиска/фильтрации). Нужен, если Вы передаете более 1 инструкции -E расширенный regex, ближе к JavaScript, Go. Активны спец символы: 8+ -r расширенный regex синтаксис. Спец символы активны по умолчанию (--regexp-extended) -P perl-совместимый regex синтаксис -s consider files as separate rather than as a single continuous long stream (--separate) 

Флаги строки-команды (указывать в конце маски):

g глобальный поиск/замена, а не только первое совпадение i,-l регистро-независимый поиск p, печать найденных подстрок d удалить строки

Примеры

Фильтрация строк

Вывести файлы соответствующие маске:

Читайте также:  Создать файл linux debian

Строки длиннее 80 символов:

sed -n '/^./p' sed -n '/^./!p' # короче 80 символов 

Замена по шаблону

Заменить строки начинающиеся с:

sed 's/^line_start=.*$/line_start="replacement"/' file

Вывести вхождения (matches) через табуляцию:

Заменить названия файлов (composer на composer-dev):

echo 'aa,bb,xx' | sed "s/xx/cc/g" # aa,bb,cc

Заменить URL в файле (штука в разделителях | , и -i для замены в файле):

sed -i "s|$old_site_url|$new_site_url|g" file.yml

Заменить параметр в конфиге:

sed -ie '/project_file_path *=/ s|=.*$|=/home/pi/apps|' ~/.config/geany/geany.conf

Заменить значение в xml-конфиге:

sed -i -r 's/(name="width" value=")[^"]+"/\148KP"/' /etc/ImageMagick-6/policy.xml

Удалить начальные пробелы (аналог ltrim):

echo " some string" | sed 's/^ *//g' 
echo " test " | xargs echo " test " | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

Удалить часть приглашения командной строки:

Удаление строк

Удалить из файла строку подходящую шаблону:

Удалить первую строку вывода:

sed 1d # удалить первую строку sed '5, 10d' # удалить строки c 5-й по 10-ю 

Удалить строки от первой до соответствующей regex:

echo '--some string' | sed 's/\(Some\)/New \1/i' # --New some string
Примечание

По умолчанию необходимо экранировать все спец. символы в regex’ах, что крайне затрудняет чтение масок. Для того, чтобы экранировать спец.символы только в случае описания в тексте их самих — включите расширенный режим regex выражений с помощью опции -r .

Удалить последние N=2 символа:

Извлечение подстрок

Вырезать / запомнить последние N=4 символа:

echo "latest" | sed "s/.*\(. $\)/\1/" # test

Источник

Оцените статью
Adblock
detector