Отправляет email-рассылки с помощью сервиса Sendsay

Синтаксический разбор строк

Доброе время суток!

Возникла проблема: в скриптах bash разбирать строки и результаты
присваивать в качестве параметров для дальнейших действий.
Например, в списке
1. (3:45:30) Track1
2. (1:43:50) Track2
....
надо найти Track2 и присвоить в переменную скрипта минуты и секунды
песни. Короче говоря, нужен добрый совет по командам разбора и
сравнения строк в bash, а так же (желательно) возможные "грабельки".
Если что, дистрибутив - Debian Sarge.
Заранее спасибо, Михаил.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 21201; Возраст листа: 768; Участников: 1400
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/427702

Ответить   Virens3 Wed, 31 Aug 2005 09:11:05 +0400 (#427702)

 

Ответы:

On Wed, 31 Aug 2005 09:11:05 +0400
Virens3 wrote:

Можно юзать регулярные выражения. Не знаю, как в POSIX, а в perl это
делается так:

/^\d+ (\d+):(\d+):(\d+) Track2$/m
$hrs = $1;
$min = $2;
$sec = $3;

POSIX regexp'ы похожы на perl'овские, но имхо победнее (в частноти \d,
обозначающее любую цифру, т.е. [0-9]).

Существует еще такие вещи как awk, но с какой стороны к нему подгодить я
не знаю. Да и не больно надо, pcre меня всегда выручал.

Советую найти книжечку по рег. выражениям.
Если есть вопросы - обращайся.

Ответить   Wed, 31 Aug 2005 20:47:45 +0400 (#427725)

 

В Срд, 31/08/2005 в 09:11 +0400, Virens3 пишет:

На каждый чих советов не напасешься. Доку читать надо, ее полно - и в
книжных магазинах, и в инете. Пример решения я внизу привел, но
объяснять не просите - не буду.

-------------------cuttime.sh start#!/bin/sh

if [ $# -ne 1 ]; then
echo -e "Usage:\n\n\t$0 track_name\n"
exit 1
fi

str=`grep "$*\$" | head -n 1`
set -- $str
time=`echo $2 | tr -d "()" | tr ":" " "`
set -- $time
hour=$1
min=$2
sec=$3
echo "hour=$hour ; min=$min ; sec=$sec"

-------------------cuttime.sh endcat файл_списка | ./cuttime.sh Track2

Ответить   Yura Kalinichenko Wed, 31 Aug 2005 21:06:19 +0300 (#427768)

 

В сообщении от 1125511579 секунд после начала Эпохи Yura Kalinichenko
написал(а):

Не проще:

$ ./cuttime.sh Track2 <файл_списка

?

Ответить   Konstantin Korikov Thu, 1 Sep 2005 05:32:04 +0300 (#428037)

 

В Чтв, 01/09/2005 в 05:32 +0300, Konstantin Korikov пишет:

Проще, более того - правильнее. Но первый вариант мне показался
нагляднее.

Ответить   Yura Kalinichenko Thu, 01 Sep 2005 09:23:54 +0300 (#428050)

 

В сообщении от 1125468665 секунд после начала Эпохи Virens3 написал(а):

На AWK:

cuttime.awk #!/bin/awk -f

$3 == t && match($2,/([0-9]+):([0-9]+):([0-9]+)/,a) {
print "hour=" a[1] "; min=" a[2] "; sec=" a[3]
}
$ ./cuttime.awk <файл_списка -v t=Track2

На Perl:

cuttime.pl #!/usr/bin/perl

/\((\d+):(\d+):(\d+)\)\s+(.*)$/ and $4 eq $ARGV[0] and
print "hour=$1; min=$2; sec=$3\n" while(<STDIN>)
$ ./cuttime.pl <файл_списка Track2

И напоследок:

$ sed -nr \
's/.*([0-9]+):([0-9]+):([0-9]+)\) Track2$/hour=\1; min=\2; sec=\3/ p' \
<файл_списка

Ответить   Konstantin Korikov Thu, 1 Sep 2005 05:27:51 +0300 (#428040)

 

В сообщении от 1125541671 секунд после начала Эпохи Konstantin Korikov
написал(а):

Или:

cuttime.bash #!/bin/bash
name=`echo "$1" |sed 's/[$^*()+|\\\[\.\/?]/\\\&/g; s/\]/\\\]/g'`
eval `sed -nr "s/.*([0-9]+):([0-9]+):([0-9]+)\\) \
$name\$/hour=\\1;min=\\2;sec=\\3/p"`
echo "hour=$hour; min=$min; sec=$sec"
$ ./cuttime.bash <файл_списка Track2

Ответить   Konstantin Korikov Thu, 1 Sep 2005 13:47:44 +0300 (#428358)