Saya ingin mem-bash parse / mengekstrak URL lengkap (dan hanya url) dari string pendek acak.
Contoh:
bob, the address is http://www.google.com
atau
https://foo.com/category/example.html is up
atau
Error 123 occurred at http://bit.ly/~1223456677878
atau
Stats are up: https://foo1234.net/report.jpg
Saya mencoba menggunakan cat foo_output | egrep -o "https?://[\w'-\.]*\s"
tetapi itu sepertinya tidak berhasil.
bash
scripting
regular-expression
Mike B
sumber
sumber
Jawaban:
Apakah Anda sudah mencoba:
sebagai gantinya?
Perhatikan bahwa apa pun dengan kelas karakter dianggap literal, jadi mengatakan
[\w]
tidak cocok dengan karakter kata . Selain itu, Anda tidak perlu melarikan diri dari metacharacter regex dalam kelas karakter, yaitu, mengatakan[\.]
tidak sama dengan[.]
.sumber
[^ ]
terlalu lebar, Anda akan ingin mengecualikan kosong lainnya,(
,)
, mungkin koma, dan semua karakter yang tidak diperbolehkan dalam URL.URI tidak cocok untuk pencocokan ekspresi reguler ketika tertanam dalam bahasa alami. Namun, keadaan saat ini adalah Improved Liberal, Accurate Regex Pattern dari John Gruber untuk URL yang Cocok . Seperti yang saat ini diposting, versi satu baris adalah sebagai berikut:
John juga tampaknya mempertahankan intisari di sini , meskipun entri blog-nya melakukan pekerjaan yang jauh lebih baik untuk menjelaskan kumpulan tesnya dan keterbatasan pola ekspresi reguler.
Jika Anda ingin menerapkan ekspresi dari baris perintah, Anda mungkin menemukan diri Anda dibatasi oleh mesin ekspresi reguler yang Anda gunakan atau dengan masalah mengutip shell. Saya telah menemukan skrip Ruby sebagai opsi terbaik, tetapi jarak tempuh Anda mungkin beragam.
sumber
Masalah dengan URL yang cocok adalah bahwa apa saja bisa ada di URL:
Seperti yang Anda lihat, (valid) URL di atas berisi
$
,?
,#
,&
,,
,.
dan:
. Pada dasarnya, satu-satunya hal yang Anda bisa pastikan URL tidak mengandung adalah ruang kosong. Dengan mengingat hal itu, Anda dapat mengekstrak URL Anda dengan pola sesederhana seperti:The
\S
cocok dengan non-ruang karakter dalam perl ekspresi reguler yang kompatibel (PCRE), yang-P
mengaktifkan PCRE untukgrep
dan-o
membuatnya mencetak hanya segmen cocok baris.sumber
Saya akan pergi untuk merantai tetapi sedikit berbeda. Jika Anda memiliki cuplikan teks seperti milik Anda dalam file teks bernama strings.txt, Anda dapat melakukan hal berikut:
Penjelasan:
Karena ada kemungkinan url tidak berfungsi, Anda dapat melakukan pengecekan kesalahan tambahan dengan URL yang Anda minati. misalnya
wget -p URL -O /dev/null
- itu akan mencetak kode kesalahan yang sangat berbeda seandainya URL tidak tersedia, sehingga Anda dapat mengatur lingkaran untuk memproses daftar tautan Anda dan menampilkan status validitasnya.Jika Anda pada akhirnya mengekstraksi tautan dari file html maka mungkin ada beberapa masalah dengan
sed
kasus khusus. Seperti yang telah disarankan dalam lucu (posting) yang mungkin sudah Anda lihat - mungkin lebih baik tidak menggunakan regexps tetapi mesin parser html. Salah satu parser yang mudah tersedia adalah browser hanya tekslynx
(tersedia di linux apa pun). Ini memungkinkan Anda untuk langsung membuang daftar semua tautan dalam sebuah file dan kemudian Anda cukup mengekstrak url yang Anda inginkan dengan grep.Namun ini tidak akan berfungsi pada sebagian besar file html yang rusak atau cuplikan teks dengan tautan.
sumber
Hanya
egrep -o 'https?://[^ ")]+'
yang akan termasuk
url()
dan "http"sumber
egrep
sudah usang.atau tambahkan perintah SED untuk menyimpannya ke file CSV:
sumber