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 IFS
für die Dauer des read
Befehls 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 read
Schleife 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.