LINUX.ORG.RU

Bash - как разбить строку на переменные?

 ,


0

1

Есть строка вида

id="573";news="http://domain.com/1.jpg,http://domain.com/2.jpg,http://domain.com/3.jpg,"
Количество элементов в news может быть разным. Как башем распарсить эту строку и передать ссылки на файлы wget? Если еще и 573 в качестве директории для сохранения передать, то вообще отлично.

Спасибо.

★★☆☆

Например так:

$ for name in `sed 's/.*news="\(.*\)"/\1/'|tr ',' ' '`
> do
> echo wget $name
> done
id="573";news="http://domain.com/1.jpg,http://domain.com/2.jpg,http://domain.com/3.jpg,"
wget http://domain.com/1.jpg
wget http://domain.com/2.jpg
wget http://domain.com/3.jpg

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

не работает для таких урлов:

echo 'id="573";news="http://domain.com/large/blabla/asdasda_1.jpg,http://domain.com/large/blabla/rsfdsfs_2.jpg' | sed 's/.*news="\(.*\)"/\1/'|tr ',' ' '
id="573";news="http://domain.com/large/blabla/asdasda_1.jpg http://domain.com/large/blabla/rsfdsfs_2.jpg
что поправить?

xtraeft ★★☆☆
() автор топика

Если строчка точна, то можно использовать прямо вот так(просто ввести строку в консоли или вставить в скрипт):

id="573";news="http://domain.com/1.jpg,http://domain.com/2.jpg,http://domain.com/3.jpg,"; mkdir $id; echo $news | sed 's/,/ /g' | xargs wget -P $id ; unset id ; unset news
shell-script ★★★★★
()

Сохраняешь эту строку в файл, подключаешь этот файл в скрипте командой source, id у тебя становится переменной с директорией, а по переменной news ты ходишь циклом

for i in `echo $news | tr ',' '\n'`; do
...
done
like-all ★★
()
Ответ на: комментарий от shell-script

всем спасибо, наверное этот вариант самый удобный. а как его использовать для файла с такими строками?

xtraeft ★★☆☆
() автор топика
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

В данном примере просто пропущена закрывающая двойная кавычка,

/rsfdsfs_2.jpg'

а sed её ждёт

's/.*news=«\(.*\)»/\1/'

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

да, в строке могут быть пробелы (в том числе в url), а баш их почему то воспринимает как перенос строки в таком простом скрипте

#!/bin/bash
for line in $(cat l.txt)
do
echo "$line"
done

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от shell-script

спасибо!
замечательно работает, но есть проблемы с именами файлов с пробелами (в url).
Взятие $news в кавычки не помогло, как передать wget урл в кавычках?

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

Ну, тогда можно попробовать как-то так:

#!/bin/bash

while read line 
do 
        eval $line 
        mkdir $id
        news=$(echo $news | sed 's/\ /%20/g')
        echo $news | sed 's/,/ /g' | xargs wget -P $id
        unset id 
        unset news
done < file
Главное, чтобы новых подробностей не появилось. :)

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

Главное, чтобы новых подробностей не появилось. :)

вроде бы не появилось, все отлично работает.

Кстати, mkdir $id делать необязательно, если использовать wget -P (он сам создает каталог).

Еще раз всем спасибо.

xtraeft ★★☆☆
() автор топика
$ a='id="573";news="http://domain.com/1.jpg,http://domain.com/2.jpg,http://domain.com/3.jpg,"'
$ IFS=$IFS\",;a=($a);for i in ${a[@]:3};do echo wget $i -P ${a[1]};done
wget http://domain.com/1.jpg -P 573
wget http://domain.com/2.jpg -P 573
wget http://domain.com/3.jpg -P 573
tides
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.