sed
Как фильтровать абзацы
Иногда возникает необходимость отфильтровать только те абзацы в тексте, которые содержат какое либо слово или строку.
Под абзацами подразумевается текст отделенный от остального текста пустой строкой.
Практический пример:
при настройке мультимедийных клавиш, xev выводит очень быстро, очень много текста. Хочется фильтровать только описание событий связанных с определенными клавишами. Например пусть это будет XF86Forward и XF86Back.
Собственно пример команды
$ xev | sed -ne 'H;$bz;/^$/{:z;g;/XF86Forward\|XF86Back/p;s/.*//;x}'Запускаем это и нажимаем все мультимедийные клавиши в поисках нужных.
Как это работает:
1. Накапливаем в буфере (hold space) абзац
2. Если находим признак окончания абзаца (в нашем случае - пустая строка) или это последняя строка, забираем из буфера накопленный.
2.1 Проверяем если нужные слова в абзаце. Если есть - печатаем абзац.
2.2. Стираем обработаный абзац.
Cамораспаковывающийся архив
Привожу заготовку для скрипта который содержит в себе архив.
#!/bin/sh sed -e '1,/^END_OF_SCRIPT$/d' $0 | base64 -d | tar -xj exit END_OF_SCRIPT
после слова "END_OF_SCRIPT" можно запулять какой нибудь tar.bz2 архивчег. например так
$ cat myrch.tar.bz2 | base64 >> scriptname.shв зависимости от того какой архив и как вы его туда запулили меняется также и комманды распаковки.
авторство скрипта пренадлежит ramok
Перевод букв в верхний/нижний регистр с помощью sed
Задача: Хочется перевести текст в верхний или нижний регистр с помощью sed. Делаем несколько попыток.
Заменить повторяющиеся пустые строки на одну пустую строку
Допустим у вас есть файл в котором множество повторяющихся пустых строк. А вам
хотелось бы повторяющиеся пустые строки заменить на одну пустую строку (что бы
было легче читать например).
sed -e ':a;/^$/N;/\n$/{D;ba}' file.txtПримечание:
В *BSD системах, однострочник придется оформить так:
sed -e :a -e '/^$/N;/\n$/{D;ba' -e '}' file.txtтак как после имени метки и перед } необходим перевод строки.
Объяснение как это работает
Краткий справочник по массовому переименовыванию файлов :-)
Иногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).
1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)
2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.
for i in *.c; do
mv $i `echo $i | sed 's/\.c$/.bak/'`
doneИнформер в консоли
Этот однострочник забирает и чистит "погодный информер" с gismeteo.ru, и может использоваться например в conky или в .bashrc
curl -s http://informer.gismeteo.ru/text/33345-1.JS|sed -e 's/^.*write("//g'|\ sed -e 's/\(<[^>]*>\)\+/\n/g'|sed -e 's/");//g'|iconv -f cp1251 -t UTF-8
Перевод шеснадцатиричного представления IP в стандартную форму в конс
перевод hex IP -> dec IP
1) bash only by ams
$ i=ffffffc0; echo $((0x${i:0:2})).$((0x${i:2:2})).$((0x${i:4:2})).$((0x${i:6:2}))2) так короче но $[] dericated
$ i=ffffffc0; echo $[0x${i:0:2}].$[0x${i:2:2}].$[0x${i:4:2}].$[0x${i:6:2}]3) тоже вроде только для bash как имеющий опцию -n в read
$ echo ffffffc0 | while read -n 2 D; do [ -z $D ] || printf "%d." 0x$D; done; echo4) sh+sed
$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)\(..\)\(..\)\(..\)/0x\1 0x\2 0x\3 0x\4/'`5) тоже но немного разбираясь в sed Ж:-)
$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)/0x\1 /g'`6) printf only by ams. но это только смотреть, пайпы не пройдут Ж:-)
Немного магии sed Ж:-)
Несколько забавных примеров:
$ echo metric | sed -e strictest metes $ echo dated | sed -e statement demented $ echo routing | sed -e stoutest resting $ echo face | sed -e secede fade $ echo ontology | sed -e sentence oncology
Для тех кто не понял подсказка Ж:-)
SUSv3 по этому поводу:
"Any character other than backslash or can be used instead of
a slash to delimit the BRE and the replacement."

