LINUX.ORG.RU

Строки, массивы и т.д.

 


0

1

есть 2 файла:
* m3u - http://rghost.ru/39139334
* bcc - http://rghost.ru/39139326
Вопрос: как выделить из m3u название канала и его айпи?
Т.е. по сути из m3u сформировать bcc...
Алгоритм такой:
1. берётся название 1го канала записывается как какая-то переменная
2. берётся айпи 1го канала записывается как какая-то вторая переменная
3. записывается в bcc файл с определённым синтаксисом (с этим думаю справлюсь сам)
4. берётся название 2го канала записывается как какая-то переменная
5. берётся айпи 2го канала записывается как какая-то вторая переменная
...
и т.д.
список адресов могу получить с помощью grep, так же с названиями, но как сделать из них массив ???
Язык: желательно bash

★★★★

Последнее исправление: i_gnatenko_brain (всего исправлений: 1)

Ответ на: комментарий от schizoid

http://wiki.bash-hackers.org/syntax/arrays

Multidimensional arrays are not implemented

init_6 ★★★★★
()
Ответ на: комментарий от i_gnatenko_brain

Тебе вообще не нужны массивы, так как по крайней мере в твоём примере в *.m3u регулярный синтаксис. Иди по строчкам и генерируй bcc.

aedeph_ ★★
()
Ответ на: комментарий от i_gnatenko_brain

я не знаю как заставить bash считать первое - записать, а потом считать именно следущее

#!/bin/bash
declare -a array
i=0
while read array[i]; do echo -e  "${array[$i]}\n I: $i"; let i++; done
cx ★★
()
Ответ на: комментарий от i_gnatenko_brain
$ array=(foo bar baz); echo ${array[0]} ${array[1]} ${array[2]}
foo bar baz
schizoid ★★★
()
Ответ на: комментарий от Hoodoo

предложишь решение на перле ? с ним вообще не знаком... (

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от cx

мы друг друга не поняли...

[brain@Brain-PC LiNK]$ grep udp a.txt
udp://@239.195.0.1:1234
udp://@239.195.0.2:1234
udp://@239.195.0.12:1234

мне нужно, чтоб 1я строка - 1й элемент
2 - 2
и т.д.
а греп выплёвывает всё единоразово

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от cx

[brain@Brain-PC LiNK]$ array=($(grep udp a.txt)); echo ${array[0]}; echo ${array[1]}
udp://@239.195.0.1:1234
udp://@239.195.0.2:1234
с этим разобрался...
теперь необходимо узнать сколько таких эл-в ( можн ос помощью grep)
и сделать цикл вывода на экран от 1 до n эл-в
Как это реализовать ?
с циклами в первый раз сталкиваюсь

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от i_gnatenko_brain

Дык а я про что?

[c0_c4] ~/tmp/btt$ grep udp ./tv-link\(Brain\).m3u | ./e2.sh  | head
STRING: udp://@239.195.0.1:1234
INDEX: 1
STRING: udp://@239.195.0.2:1234
INDEX: 2
STRING: udp://@239.195.0.12:1234
INDEX: 3
STRING: udp://@239.195.0.7:1234
INDEX: 4
STRING: udp://@239.195.0.5:1234
INDEX: 5

cx ★★
()

Пожалуйста, пожалуйста, ПОЖАЛУЙСТА! Прекратите путать bash с языком программирования!

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Программы на sed разрывают тебя на части?

anonymous
()
Ответ на: комментарий от aedeph_

не разобрался с ним, хотя не очень долго пытался

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от aedeph_

Брейнфак полон по Тьюрингу, Subtract and branch if less than or equal to zero полон по Тьюрингу. Игра жизнь и многие другие клеточные автоматы тоже полны по Тьюрингу. Да чёрт возьми, машина Тьюринга полна по Тьюрингу.

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

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Брейнфак является языком программирования, внезапно.

Практическое применение - вопрос ортогональный.

aedeph_ ★★
()
Ответ на: комментарий от cx

[brain@Brain-PC LiNK]$ a=«#EXTINF:0,Первый канал»; echo «${a#*EXTINF*,}»
Первый канал
думаю пока инфы хватит - пробую сделать... появятся вопросы - напишу

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от i_gnatenko_brain
$ cat parse.awk 
BEGIN{ t=0; id=1;
  DomainName="link-spb.ru";
  print "<ServiceDiscovery xmlns=\"urn:dvb:ipisdns:2006\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">";
  print "\t<BroadcastDiscovery DomainName=\""DomainName"\" Version=\"0\">";
}
/#EXTM3U/{ t=0; }
/#EXTINF/{ t=1; sub(/\r/,""); sub("#EXTINF:[\-0-9]*,",""); name=$0; next;}
{ if(t==1)
  {
    sub(/\r/,""); sub("//@",""); split($0,M,":");
    streaming=M[1];
    address=M[2];
    port=M[3];
    print "\t\t<ServiceList>";
    print "\t\t\t<SingleService id=\""id"\" type=\"tv\">";
    print "\t\t\t\t<ServiceLocation>";
    print "\t\t\t\t\t<IPMulticastAddress Address=\""address"\" Port=\""port"\" Streaming=\""streaming"\"/>";
    print "\t\t\t\t</ServiceLocation>";
    print "\t\t\t\t<TextualIdentifier DomainName=\""DomainName"\" ServiceName=\""name"\"/>";
    print "\t\t\t\t<MaxBitrate>5</MaxBitrate>";
    print "\t\t\t\t<Rating value=\"R\"/>";
    print "\t\t\t</SingleService>";
    print "\t\t</ServiceList>";
    id++;
  } t=0;
}
END{
  print "\t</BroadcastDiscovery>";
  print "</ServiceDiscovery>";
}
$ awk -f parse.awk tv-link\(Brain\).m3u >out.bcc
awk: parse.awk:7: предупреждение: последовательность `\-' считается `-'
$ cat out.bcc | head -n 15; echo "..."; cat out.bcc | tail -n 5
<ServiceDiscovery xmlns="urn:dvb:ipisdns:2006" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<BroadcastDiscovery DomainName="link-spb.ru" Version="0">
		<ServiceList>
			<SingleService id="1" type="tv">
				<ServiceLocation>
					<IPMulticastAddress Address="239.195.0.1" Port="1234" Streaming="udp"/>
				</ServiceLocation>
				<TextualIdentifier DomainName="link-spb.ru" ServiceName="Первый канал"/>
				<MaxBitrate>5</MaxBitrate>
				<Rating value="R"/>
			</SingleService>
		</ServiceList>
		<ServiceList>
			<SingleService id="2" type="tv">
				<ServiceLocation>
...
				<Rating value="R"/>
			</SingleService>
		</ServiceList>
	</BroadcastDiscovery>
</ServiceDiscovery>
anonymous
()
Ответ на: комментарий от anonymous

Многострочник на awk :). Тоже хотел предложить.

vahtu
()
Ответ на: комментарий от anonymous

#EXTINF/{ t=1; sub(/\r/,""); sub(«#EXTINF:[\-0-9]*,»,""); name=$0; next;}
awk: parse.awk:7: предупреждение: последовательность `\-' считается `-'
можно ли убрать \ или это на что-то повлияет ?

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от PolarFox

Прекратите путать bash с языком программирования

Больше, больше надрыва, братюнь

Следующий куплет не заставил себя ждать:
Пожалуйста, пожалуйста, ПОЖАЛУЙСТА! Прекратите фильтровать логи с помощью grep, для этого есть VIsual C++!

Чувак, да это же репчик!

zolden ★★★★★
()
Ответ на: комментарий от i_gnatenko_brain

Может хотел отрицательные числа учитывать. Но это длительность в секундах - врядли она может быть отрицательной. А может и просто опечатался?

vahtu
()
Ответ на: комментарий от anonymous

а за решение моей проблемы огрооомное спасибо.

i_gnatenko_brain ★★★★
() автор топика
Ответ на: комментарий от i_gnatenko_brain

привычка, считай что опечатался

anonymous
()
Ответ на: комментарий от anonymous

я почти решил свою задачу при помощи grep, wl и подобной штуки )))

i_gnatenko_brain ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.