Sed
Утилита 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’ # вывести только строки подходящие по маске
В качестве разделителей можно использовать любые символы (напрмиер: #, @). Match части (которые внутри круглых скобок) доступны как \1, \2, \n.
Опции:
-e – добавление скрипта или regex в исполняемые команды
-r – использовать расширенный синтаксис регулярных выражений (спец символы активны по умолчанию)
-d – удалить
-s – заменить
-p – распечатать найденную строку
-i – выполнять изменения непосредственно в файле
Флаги:
p, печать найденных подстрок
i,-l регистронезависимый поиск
g глобальный поиск/замена, а не только первое совпадение
d удалить строки
Примеры
Фильтрация строк
Вывести строки 1-5:
sed '1,5p'
Вывести файлы соответствующие маске:
ls | sed -n '/composer/p'
Строки длиннее 80 символов:
sed -n '/^.{80}/p' sed -n '/^.{80}/!p' # короче 80 символов
Замена вхождений
Вывести вхождения (matches) через табуляцию:
-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 для замены в файле):
-i "s|$old_site_url|$new_site_url|g" file.yml
Удалить начальные пробелы (аналог ltrim):
echo " some string" | sed 's/^ *//g'
Удаление строк
Удалить первую строку вывода:
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
Замена строки со спецсимовалами
В данном примере заменим
http://backend-old.itc-life.ru/contacts/;
на
http://backend-node.itc-life.ru/contacts/;
для всех файлах в каталоге /etc/nginx/conf.d/ с расширением .conf
делаем командой
sed -i -r 's/proxy_pass\ http:\/\/backend-old.itc-life.ru\/contacts\/;/proxy_pass\ http:\/\/backend-node.itc-life.ru\/contacts\/;/g' /etc/nginx/conf.d/*.conf
Удалить строку, начинающуюся с символа #. Очень просто
sed '/#/ d' file_with.list >> file_without_.list
Удалить все строки, не содержащие символ #. Очень просто
sed '/#/ !d' sedtest.txt >> sedtext2.txt