У меня есть файл с большим количеством таких строк
/item/pubDate=Вс, 23 фев 2014 00:55:04 +010
Если я это выполню
echo "/item/pubDate=Sun, 23 Feb 2014 00:55:04 +010" | grep -Po "(?<=\=).*"
Sun, 23 Feb 2014 00:55:04 +010
Я получаю правильную дату (всё в одной строке). Теперь я хочу попробовать это с большим количеством дат в XML-файле. Я использую это, и всё в порядке.
xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*"
Fri, 22 Jan 2016 17:56:29 +0100
Sun, 13 Dec 2015 18:33:02 +0100
Wed, 18 Nov 2015 15:27:43 +0100
...
Но теперь я хочу использовать дату в программе bash и получаю такой вывод
for fecha in $(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*"); do echo $fecha; done
Fri,
22
Jan
2016
17:56:29
+0100
Sun,
13
Dec
2015
18:33:02
+0100
Wed,
18
Nov
2015
15:27:43
+0100
Мне нужно вывести дату в одну строку (в переменной fecha), как в первом и втором примерах, но я не знаю, как это сделать.
решение1
Вместо этого сделайте вот так:
while IFS= read -r fecha; do
echo $fecha
done < <(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*")
Bash разделит "слова" для цикла по символам во внутреннем разделителе полей ( $IFS
). Вы можете временно отключить это поведение, установив IFS
значение none на время выполнения команды read
. Приведенный выше шаблон всегда будет циклировать построчно.
<(command)
делает вывод команды похожим на настоящий файл, который мы затем перенаправляем в наш read
цикл.
$ while IFS= read -r line; do echo $line; done < <(cat ./test.input)
Fri, 22 Jan 2016 17:56:29 +0100
Sun, 13 Dec 2015 18:33:02 +0100
Wed, 18 Nov 2015 15:27:43 +0100
решение2
xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*" \
| while read L
do
echo $L
done
читатьразрывает строки и не разделяет слова, если его об этом не просят. :-)
Однако, работа с XML с помощью регулярных выражений — это привнесение ножа в перестрелку. Очень легко создать допустимый XML, который указанный выше конвейер либо пропустит, либо неправильно зафиксирует.
Если вы много работаете с XML, вам действительно стоит освоить парсер SAX.