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

Категория: Bash

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

Важно!

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

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

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

echo "text" | perl -pe 's/\n/_/'

Шаблон:

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   regex команда замены/удаления или выражение для поиска/фильтрации (может быть несколько)
-r   использовать расширенный синтаксис. Спец символы активны по умолчанию (--regexp-extended)
-s   consider files as separate rather than as a single continuous long stream (--separate)

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

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

Примеры

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

Вывести строки 1-5:

sed '1,5p'
head -5

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

ls | sed -n '/composer/p'

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

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

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

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

sed -r 's/^ +([^ ]+) +(.+)$/\1\t\2/'

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

ls | sed -r 's/(composer)/\1-dev/g'

Заменить символы (regex):

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

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

echo "   some string" | sed 's/^ *//g'

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

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

sed '/regex/d' /path/file

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

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

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

sed "1,/end string pattern/d"

Заменить подстроку:

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

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

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

sed '/^$/d'

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

echo "latest" | sed "s/..$//" # late

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

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

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

#sed, #regexp, #bash

категория: Bash