1 (07.06.2011 11:20:19 отредактировано Fat-Zer)

Написал свой первый sed скрипт для преобразования  из такого:

Autoconf (2.68) - 1,350 KB:
Home page: http://www.gnu.org/software/autoconf/
Download: http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2
MD5 sum: 864d785215aa60d627c91fcb21b05b07
Automake (1.11.1) - 1,042 KB:
Home page: http://www.gnu.org/software/automake/
Download: http://ftp.gnu.org/gnu/automake/automake-1.11.1.tar.bz2
MD5 sum: c2972c4d9b3e29c03d5f2af86249876f

в файл для проверки контрольных сумм:

864d785215aa60d627c91fcb21b05b07  autoconf-2.68.tar.bz2
c2972c4d9b3e29c03d5f2af86249876f  automake-1.11.1.tar.bz2

сам скрипт:

 Консоль:
cat src | sed -r '/Download: /!d;s/$/ /;s/.+\///;x;s/.*//;N;s/MD5 sum: //;p;s/.*//;x' | sed -r '/^ *$/d;N;s/\n/  /;s/ +$//' >md5sum

Собственно, критика? Что не так7 что можно сделать проще?

95% процентов проблем находятся между клавиатурой и стулом.

2

Fat-Zer пишет:

cat src | sed -r '/Download: /!d;s/$/ /;s/.+\///;x;s/.*//;N;s/MD5 sum: //;p;s/.*//;x' | sed -r '/^ *$/d;N;s/\n/  /;s/ +$//' >md5sum

одностроки - маздай

/Download: /!d
s/$/ /
s/.+\///
x
s/.*//
N;
s/MD5 sum: //
p
s/.*//;
x
' 
| sed -r '
/^ *$/d
N
s/\n/  /
s/ +$//
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

drBatty пишет:

одностроки - маздай

зато когда люди видят такое, то понимают, что ты действительно не из этого мира)).
+писал в командной строке, поэтому разбивать на строки не хотелось...
а кроме того, чтобы записать так, чтобы белые люди это понимали ничего нет? например нерационального использования? лишних команд? и как вообще объеденить это всё в одну команду?

95% процентов проблем находятся между клавиатурой и стулом.

4

Fat-Zer пишет:

зато когда люди видят такое, то понимают, что ты действительно не из этого мира)).

ну тема ведь "посмотрите мой скрипт"? смотреть неудобно.

Fat-Zer пишет:

+писал в командной строке, поэтому разбивать на строки не хотелось...

пишите в Vim'е. там и подсветка есть, и вообще... Удобно!

Fat-Zer пишет:

а кроме того, чтобы записать так, чтобы белые люди это понимали ничего нет? например нерационального использования? лишних команд?

дело в том, что разбивать команды вы можете как угодно, по синтаксису sed всё едино - точка с запятой или перевод строки.
Однако, есть множество команд (a,i,c,w,W,r,R и ещё какие-то), где параметр "до конца строки". Вам придётся писать так:

sed -e 'a какой-то текст' -e 'a ещё текст' -e 'w имя файла'
Fat-Zer пишет:

как вообще объеденить это всё в одну команду?

зачем?
можно конечно. только, напишите по-русски, ЧТО этот скрипт делает (можно только для себя).
Hint: в sed есть блоки как в C:

/условие/{
 # какие-то команды по условию
}
# безусловные команды

Кстати, используемая вами d это тоже на самом деле команда условного перехода.

/условие/d
# здесь команды, которые выполняются если невыполнено условие

5

emulek пишет:

можно конечно. только, напишите по-русски, ЧТО этот скрипт делает (можно только для себя).

в первом посте есть пример исходных данных и результата. надо выдрать имя скачанного файла и контрольную сумму. и записать их красиво для "md5sum -c"

95% процентов проблем находятся между клавиатурой и стулом.

6 (10.06.2011 12:33:34 отредактировано drBatty)

Fat-Zer пишет:

надо выдрать имя скачанного файла и контрольную сумму. и записать их красиво

ну вот как-то так:

#!/bin/sed -rnf

/^Download:\s+/{
    s~.*/~~
    h
}

/^MD5 sum:\s+/{
    s///
    H
    g
    s/.+\n/ /p
    z
    h
}

согласитесь - всё намного понятнее?

//fixed
дополнительная фича - если ссылки не было, то вообще ничего не напечатает.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7 (11.06.2011 13:27:33 отредактировано Fat-Zer)

растолкуйте, что делает "s~.*/~~"

ЗЫ: про комманды g и h не знал... поэтому всё так и получилось громостко и запутано...

95% процентов проблем находятся между клавиатурой и стулом.

8

Fat-Zer пишет:

растолкуйте, что делает "s~.*/~~" и "s///"

ЗЫ: про комманды g и h не знал... поэтому всё так и получилось громостко и запутано...

http://drbatty.ru/sed (Сегодня с 6:00 до 14:00 по московскому времени проводятся плановые работы)

s~.*/~~ заменяет любые символы в любом количестве (да побольше!) за которыми идёт слеш на "".
например "Download: http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2" заменится на "autoconf-2.68.tar.bz2"

s/// это команда, которая заменяет регулярку на "".

регулярное выражение == компилируемая программа. И её можно использовать много раз.

/ABC/p # ищем строку с ABC и её печатаем
s//DEF/g # заменяем ранее скомпилированое выражение (ABC) на DEF. Причём, в первый раз найдётся лишь первое совпадение, а в этот раз - все ABC заменяются на DEF.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

// fixed

#!/bin/sed -rnf

/^Download:\s+/{
    s~.*/~~
    h
}

/^MD5 sum:\s+/{
    s///
    G
    s/\n/ /
    p
}
drBatty пишет:

s~.*/~~ заменяет любые символы в любом количестве (да побольше!) за которыми идёт слеш на "".

не могу найти, где такой синтаксис s описан...

ЗЫ: уже почти 3, а сервис до сих пор лежит...

95% процентов проблем находятся между клавиатурой и стулом.

10

Fat-Zer пишет:

не могу найти, где такой синтаксис s описан...

ЗЫ: уже почти 3, а сервис до сих пор лежит...

заработал сервер.

обычно пишут s/abc/def/, но вместо слеша можно использовать любой символ, например s~abc~drf~ это тоже самое.

ненавижу заборы http:\/\/drbatty\.ru\/sed  ac

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)