sed в linux - примеры использования
Утилита 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 указывает на передачу инструкции (команда замены/удаления или выражение для поиска/фильтрации). Нужен, если Вы передаете более 1 инструкции
-E расширенный regex, ближе к JavaScript, Go. Активны спец символы: [0-9]+
-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 удалить строки
Примеры
Фильтрация строк
Вывести строки 1-5:
sed '1,5p'
head -5
Вывести файлы соответствующие маске:
ls | sed -n '/composer/p'
Строки длиннее 80 символов:
sed -n '/^.{80}/p'
sed -n '/^.{80}/!p' # короче 80 символов
Замена по шаблону
Заменить строки начинающиеся с:
sed 's/^line_start=.*$/line_start="replacement"/' file
Вывести вхождения (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
Заменить значение в xml-конфиге:
sed -i -r 's/(name="width" value=")[^"]+"/\148KP"/' /etc/ImageMagick-6/policy.xml
Удалить начальные пробелы (аналог ltrim):
echo " some string" | sed 's/^ *//g'
Удалить конечные пробелы:
echo "test " | sed 's/ *$//'
Альтернатива trim:
echo " test " | xargs
echo " test " | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
Удалить line breaks:
tr -d '\n'
Удалить часть приглашения командной строки:
xsel -p -o | sed 's/^[^\$|#]*[\$|#] //'
Удаление строк
Удалить из файла строку подходящую шаблону:
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 #trim #replace