für Schleife über Eingabezeilen

für Schleife über Eingabezeilen

Ich habe eine Datei mit vielen Zeilen wie dieser

/item/pubDate=So, 23. Februar 2014 00:55:04 +010

Wenn ich dies ausführe

echo "/item/pubDate=Sun, 23 Feb 2014 00:55:04 +010" | grep -Po "(?<=\=).*"

Sun, 23 Feb 2014 00:55:04 +010

Ich erhalte das korrekte Datum (alles in einer Zeile). Jetzt möchte ich dies mit vielen Daten in einer XML-Datei versuchen. Ich verwende dies und es ist ok.

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

Aber jetzt möchte ich das Datum in einem Bash-Programm verwenden und erhalte diese Ausgabe

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

Ich möchte das Datum in einer Zeile ausgeben (in der Variable fecha), wie im ersten und zweiten Beispiel, aber ich weiß nicht, wie das geht.

Antwort1

Machen Sie es stattdessen so:

while IFS= read -r fecha; do
    echo $fecha
done < <(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*")

Bash trennt die zu durchlaufenden „Wörter“ nach Zeichen im internen Feldtrennzeichen ( $IFS). Sie können dieses Verhalten vorübergehend deaktivieren, indem Sie IFSfür die Dauer des readBefehls nichts festlegen. Das obige Muster wird immer zeilenweise durchlaufen.

<(command)lässt die Ausgabe eines Befehls wie eine echte Datei aussehen, die wir dann in unsere readSchleife umleiten.

$ 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

Antwort2

xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*" \
| while read L
  do
    echo $L
  done

lesenbricht Zeilenumbrüche durch und trennt Wörter nicht, sofern dies nicht angefordert wird. :-)

XML mit regulären Ausdrücken zu bearbeiten ist jedoch wie ein Messer in eine Schießerei zu bringen. Es ist sehr einfach, gültiges XML zu konstruieren, das die obige Pipeline entweder übersieht oder falsch erfasst.

Wenn Sie viel mit XML arbeiten, sollten Sie sich unbedingt mit einem SAX-Parser vertraut machen.

verwandte Informationen