Ubah tanggal “29 Juli 2011” menjadi “20110729”

8

Saya punya banyak file HTML berisi tanggal dengan format July 29th, 2011

Saya ingin mengubah format tanggal July 29th, 2011menjadi 20110729, December 9th, 2010ke 20101209, dll.

Saya pikir sedmungkin berhasil tetapi masih tidak dapat menemukan solusi karena urutan tidak langsungnya.

Najib-botak Chin
sumber
Anda akan lebih baik dengan perl yang dapat membaca satu format tanggal dan menampilkan yang lain, tetapi perl-foo saya tidak cukup baik, semoga orang lain akan
ikut campur

Jawaban:

7

Hal semacam ini jauh lebih sulit daripada seharusnya dengan kebanyakan alat. awkModul POSIX GNU dan Perl keduanya memberi Anda strftime(), tapi bukan strptime(), yang Anda inginkan.

Bagaimanapun, masih cukup mudah dengan Perl ...

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

Jelas ada lebih dari itu, karena Anda benar-benar ingin mengonversi HTML. Jika Anda bisa mengetahui regex dengan sed yang akan bekerja untuk menemukan string tanggal, Anda harus dapat melakukan sesuatu yang sangat mirip dengan Perl.

$ 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
sumber
Di mana / Bagaimana saya mendapatkan Date::Manipmodul? ... Perl saya memberi saya kesalahan, "Tidak dapat menemukan Date / Manip.pm di @INC ..." . Apakah ini modul tambahan yang perlu saya instal? ... Saya menggunakan perl, v5.10.1
Peter.O
@ Fred: Sebagian besar manajer paket distro akan memilikinya, coba cari di sana. Di sistem saya nama paketnya perl-Date-Maniptetapi nama Anda akan berbeda-beda. Anda juga bisa menggunakannya cpan.
Caleb
@StevenPritchard: Anda menulis jawaban yang baik dan berguna, saya senang melihat Anda di komunitas ini. Saya hanya ingin mencatat bahwa komunitas ini bergantung pada suara untuk tetap berfungsi. Tidak hanya suara membantu mengurutkan jawaban tetapi mereka membentuk situs dengan mengubah apa yang terlihat di mana, hasil pencarian, dan yang paling penting membantu menjaga pengguna yang baik di sekitar untuk mengawasi situs. Tanpa suara itu mati. Anda hanya memberikan 3 suara total. Anda diberikan 30 untuk digunakan setiap hari! Silakan pertimbangkan untuk menggunakan pengetahuan Anda untuk meningkatkan situs ini dengan memilih apa yang Anda anggap berharga atau tidak.
Caleb
@ Caleb: Terima kasih. Ada dalam repositori Ubuntu sebagai libdate-manip-perl.... @Steven Pritchard: Ini adalah solusi yang bagus ... Terima kasih.
Peter.O
1
Tanggal GNU memang memiliki parsing dan pencetakan, tetapi July 29th, 2011bukan format yang dikenali ( July 29, 2011berfungsi), dan Anda harus meletakkan cukup banyak shell dan infrastruktur sed / awk di sekitarnya.
Gilles 'SANGAT berhenti menjadi jahat'