LinuxForum.Fans
Тема

посмотрите мой sed скрипт.

Автор: Fat-Zer 10 сообщений 2885 просмотров
#167945

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

text

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

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

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

сам скрипт:
[console]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[/console]
Собственно, критика? Что не так7 что можно сделать проще?

#167995
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

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

text
/Download: /!d
s/$/ /
s/.+\///
x
s/.*//
N;
s/MD5 sum: //
p
s/.*//;
x
' 
| sed -r '
/^ *$/d
N
s/\n/  /
s/ +$//
#168055
drBatty написал:
одностроки - маздай

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

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

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

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

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

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

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

text
sed -e 'a какой-то текст' -e 'a ещё текст' -e 'w имя файла'
Fat-Zer написал:
как вообще объеденить это всё в одну команду?

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

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

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

text

/условие/d
# здесь команды, которые выполняются если невыполнено условие
#168181
emulek написал:
можно конечно. только, напишите по-русски, ЧТО этот скрипт делает (можно только для себя).

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

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

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

text
#!/bin/sed -rnf

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

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

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

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

#169231

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

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

#169248
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.

#169263

// fixed

text

#!/bin/sed -rnf

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

/^MD5 sum:\s+/{ s/// G s/\n/ / p }

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

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

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

#169291
Fat-Zer написал:
не могу найти, где такой синтаксис s описан...

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

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

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

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

Войдите или зарегистрируйтесь, чтобы ответить.