для цикла по входным линиям

для цикла по входным линиям

У меня есть файл с большим количеством таких строк

/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.

Связанный контент