Работаем c sed

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.