sed


ramok аватар

Как фильтровать абзацы

Иногда возникает необходимость отфильтровать только те абзацы в тексте, которые содержат какое либо слово или строку.
Под абзацами подразумевается текст отделенный от остального текста пустой строкой.

Практический пример:
при настройке мультимедийных клавиш, xev выводит очень быстро, очень много текста. Хочется фильтровать только описание событий связанных с определенными клавишами. Например пусть это будет XF86Forward и XF86Back.

Собственно пример команды

$ xev | sed -ne 'H;$bz;/^$/{:z;g;/XF86Forward\|XF86Back/p;s/.*//;x}'

Запускаем это и нажимаем все мультимедийные клавиши в поисках нужных.

Как это работает:
1. Накапливаем в буфере (hold space) абзац
2. Если находим признак окончания абзаца (в нашем случае - пустая строка) или это последняя строка, забираем из буфера накопленный.
2.1 Проверяем если нужные слова в абзаце. Если есть - печатаем абзац.
2.2. Стираем обработаный абзац.
 

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)

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

0
Ваша оценка: Ничего

Перевод букв в верхний/нижний регистр с помощью sed

Задача: Хочется перевести текст в верхний или нижний регистр с помощью sed. Делаем несколько попыток.

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Заменить повторяющиеся пустые строки на одну пустую строку

Допустим у вас есть файл в котором множество повторяющихся пустых строк. А вам
хотелось бы повторяющиеся пустые строки заменить на одну пустую строку (что бы
было легче читать например).

sed -e ':a;/^$/N;/\n$/{D;ba}' file.txt

Примечание:


В *BSD системах, однострочник придется оформить так:

sed -e :a -e '/^$/N;/\n$/{D;ba' -e '}' file.txt

так как после имени метки и перед } необходим перевод строки.

Объяснение как это работает

0
Ваша оценка: Ничего
ramok аватар

Краткий справочник по массовому переименовыванию файлов :-)

Иногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).

1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)

2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.

for i in *.c; do
  mv $i `echo $i | sed 's/\.c$/.bak/'`
done
0
Ваша оценка: Ничего

Информер в консоли

Этот однострочник забирает и чистит "погодный информер" с 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
0
Ваша оценка: Ничего
ramok аватар

Перевод шеснадцатиричного представления 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; echo

4) 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. но это только смотреть, пайпы не пройдут Ж:-)
 

0
Ваша оценка: Ничего
ramok аватар

Немного магии 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."

0
Ваша оценка: Ничего