Ändern Sie das Datum "29. Juli 2011" in "20110729"

8

Ich habe viele HTML-Dateien enthält Datum mit Format July 29th, 2011

Ich möchte das Datumsformat July 29th, 2011auf 20110729, December 9th, 2010auf 20101209usw. ändern .

Ich denke, es sedkönnte funktionieren, aber ich kann die Lösung aufgrund ihrer indirekten Reihenfolge immer noch nicht finden.

Najib-Botak Chin
quelle
Mit Perl, das ein Datumsformat lesen und ein anderes ausgeben kann, sind Sie besser dran, aber mein Perl-Foo ist nicht gut genug, hoffentlich
mischt sich

Antworten:

7

So etwas ist viel schwieriger als es mit den meisten Werkzeugen sein sollte. GNU awkund Perls POSIX-Modul geben Ihnen beide ein strftime(), aber kein strptime(), was Sie wollen.

Auf jeden Fall ist es mit Perl immer noch ziemlich einfach ...

$ perl -MDate::Manip -lpe '$_=UnixDate(ParseDate($_), "%Y%m%d")' <<END
> July 29th, 2011
> December 9th, 2010
> END
20110729
20101209

Natürlich steckt noch mehr dahinter, da Sie den HTML-Code tatsächlich konvertieren möchten. Wenn Sie mit sed einen regulären Ausdruck finden können, mit dem die Datumszeichenfolgen ermittelt werden können, sollten Sie in der Lage sein, mit Perl etwas sehr Ähnliches zu tun.

$ perl -MDate::Manip -lpe 's/(")([^"]+)(")/$1 . UnixDate(ParseDate($2), "%Y%m%d") . $3/ge' <<END
dates enclosed "July 29th, 2011" in quotes
"December 9th, 2010"
END
dates enclosed "20110729" in quotes
"20101209"
Steven Pritchard
quelle
Woher / wie bekomme ich das Date::ManipModul? ... Mein Perl gibt mir den Fehler "Datum / Manip.pm in @INC kann nicht gefunden werden ..." . Ist es ein zusätzliches Modul, das ich irgendwie installieren muss? ... Ich benutze Perl, v5.10.1
Peter.O
@fred: Die meisten Distributions-Paketmanager werden dies haben, versuchen Sie dort zu suchen. Auf meinem System lautet der Paketname, perl-Date-Manipaber Ihr Name variiert. Sie könnten es auch mit bekommen cpan.
Caleb
@StevenPritchard: Du schreibst gute und nützliche Antworten, ich freue mich, dich in dieser Community zu sehen. Ich möchte nur darauf hinweisen, dass diese Community auf Stimmen angewiesen ist , um weiterhin funktionieren zu können. Stimmen helfen nicht nur beim Sortieren von Antworten, sondern gestalten auch die Website, indem sie ändern, was wo sichtbar ist, Suchergebnisse und vor allem gute Benutzer bei der Überwachung der Website unterstützen. Ohne Stimmen stirbt es. Sie haben insgesamt nur 3 Stimmen abgegeben. Sie erhalten 30 für jeden Tag! Bitte erwägen Sie, Ihr Wissen zu nutzen, um diese Website zu verbessern, indem Sie darüber abstimmen, was Sie für wertvoll halten oder nicht.
Caleb
@Caleb: Danke. Es ist in Ubuntus Repository als libdate-manip-perl... @Steven Pritchard: Es ist eine schöne Lösung ... Danke.
Peter.O
1
Das GNU-Datum kann sowohl analysiert als auch gedruckt werden, July 29th, 2011ist jedoch kein anerkanntes Format ( July 29, 2011funktioniert), und Sie müssten einiges an Shell- und Sed / Awk-Infrastruktur darauf aufbauen.
Gilles 'SO - hör auf böse zu sein'