sed
[
Пред. ] [ Содержание ] [
След. ]
sed
http://onedev.net/post/267 Утилита 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 "1,/end string pattern/d"# Удалить строки от первой до соответствующей regex
sed 1d # удалить первую строку
sed '5, 10d' # удалить строки c 5-й по 10-ю
sed -e 's/This/That/; s/test/another test/' ./myfile # замена двух фрагментов текста:
sed -i '3,$d' myfile #удалить строки, начиная с заданной — и до конца файла
sed '/^$/d' filename.txt #удалить все пустые строки
sed '/./!d' filename.txt #удалить все пустые строки
В качестве разделителей можно использовать любые символы (напрмиер: #, @).
Match части (которые внутри круглых скобок) доступны как \1, \2, \n.
Опции: -e - добавление скрипта или regex в исполняемые команды
-r - использовать расширенный синтаксис регулярных выражений (спец символы активны по умолчанию)
-d - удалить
-s - заменить
-p - распечатать найденную строку
-i - выполнять изменения непосредственно в файле
-n не выводить результат замены/поиска на экран (--quiet, --silent)
Флаги: 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) через табуляцию:
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
Удалить начальные пробелы (аналог 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 '1,20 d; 55,90 d; 180,677 d;' а можно сделать по-другому, указать только те строки, которые нужно оставить:
sed -n '21,54 p; 91,179 p; 678,$ p;' Добавить строчку в начало файла sed -i -e '1 s/^/
string\n/;' file
'переменная' вместо
string sed позволяет задавать символы-разделители для использования их в команде замены.
Разделителем считается первый символ, который будет встречен после s:
$
sed 's!/bin/bash!/bin/csh!' /etc/passwd Удалить интервал между строками 7 и 9: sed '7,9d' filename.txt Та же операция, что и приведенная выше, но с заменой адреса параметрами:
sed '/-Start/,/-End/d' filename.txt Вырезать Email из строки http://www.balamutick.ru/node/21 Created Воскресенье 30 Октябрь 2016
cat /var/log/maillog
^^ - выведеет файд /var/log/maillog на экран
grep "Mailbox disabled for this recipient"
^^^ - отсортирует строчки содержащие сочетание слов "Mailbox disabled for this recipient".
Эти две команды должны применяться в потоковом контейнере программ значок "|", а конкретно вот так:
cat /var/log/maillog | grep "Mailbox disabled for this recipient"
В ответ вы получите что-то типа: Feb 7 12:39:04 microsoft sm-mta[72873]: s17sffd2Ed3jJ072873: ruleset=check_rcpt, arg1=<
vasya@microsoft.com>, relay=segment-223-30.sify.net [223.30.12.34] (may be forged), reject=550 5.2.1 <
vasya@microsoft.com>... Mailbox disabled for this recipient
Итак обрезать ДО символа <
sed 's|.*<||'
cat /var/log/maillog | grep "Mailbox disabled for this recipient" | sed 's|.*<||'
или
cut -d"<" -f2
cat /var/log/maillog | grep "Mailbox disabled for this recipient" | cut -d"<" -f2
Но получили мы строчку типа: "
vasya@microsoft.com>, relay=segment-223-30.sify.net [223.30.12.34] (may be forged), reject=550 5.2.1 <
vasya@microsoft.com>... Mailbox disabled for this recipient"
Это уже хорошо, но пока ещё не готово. Теперь будем искать способ, удалить этими же средствами, всё ПОСЛЕ символа ">".
sed -r 's/>.+//'
cat /var/log/maillog | grep "Mailbox disabled for this recipient" | sed 's|.*<||'|sed -r 's/>.+//'
^^^^ Вот так можно добиться обрезания в файле maillog всёх букв до символа < и всех букв после символа >.
удаление строки из файла с его перезаписью https://unixforum.org/viewtopic.php?t=63484 sed -i "/$STR/d" "$FILE" sed -i "/44444/d" "test"
Содержание