Jadi saya punya garis:
ID: 54376
Bisakah Anda membantu saya membuat regex yang hanya akan mengembalikan nomor tanpa "ID:"?
CATATAN: String ini ada dalam file.
text-processing
regular-expression
Blake Gibbs
sumber
sumber
-o
dan-P
adalah GNU ekstensi untukgrep
.-o
bekerja di BSD juga. Dukungan PCRE-P
tidak selalu dikompilasi dengan baik.Gunakan
egrep
dengan-o
ataugrep
dengan-Eo
opsi untuk mendapatkan hanya segmen yang cocok. Gunakan[0-9]
sebagai regex untuk mendapatkan nomor saja:sumber
Ada banyak cara untuk melakukan ini. Sebagai contoh:
Gunakan GNU
grep
dengan PCRE terbaru dan cocokkan angka setelahID:
:Gunakan
awk
dan cukup cetak bidang terakhir dari semua baris yang dimulai denganID:
Itu juga akan mencetak bidang yang bukan angka, untuk mendapatkan angka saja, dan hanya di bidang kedua, gunakan
Gunakan GNU grep dengan Ekspresi Reguler Diperpanjang dan parsing dua kali:
sumber
\K
yang dilakukan dalam contoh pertama?-o
untuk mencetak hanya bagian yang cocok tetapi juga membuang hal-hal yang saya tidak tertarik. Bandingkanecho "foobar" | grep -oP "foobar"
danecho "foobar" | grep -oP 'foo\Kbar'
Itu hanya akan mencetak semua angka dan spasi yang terjadi setelah
ID: 54376
input file apa pun.Saya baru saja memperbarui sedikit di atas untuk membuatnya sedikit lebih cepat dengan
*
dan tidakp
merusak garis kosong setelah menghapus karakter non-{numeric, spasi}.Ini alamat baris dari regex
/ID: 54376/
,
melalui yang$
terakhir dan pada merekas///
menghapus semua atau*
karakter apa pun^
tidak[^ 0-9]*
kemudianp
merusak/
setiap/
baris dengan.
karakter yang tersisa.DEMO:
KELUARAN:
sumber
Menggunakan sed:
Ini
-n
adalah "jangan cetak apa pun secara default",/^ID: [0-9][0-9]*$/
adalah "untuk baris yang cocok dengan regex ini" (dimulai dengan "ID:", lalu 1 digit atau lebih, lalu ujung baris), dans/ID: //p
isian formulirs/pattern/repl/flags
-s
artinya kita sedang melakukan pengganti, untuk mengganti pola"ID: "
dengan teks pengganti""
(string kosong) menggunakanp
bendera, yang berarti "cetak baris ini setelah melakukan penggantian".Keluaran:
sumber
Perintah sed GNU lain,
Ini mencetak nomor apa pun setelah
ID:
sumber
+
. Jika perbedaan antara satu karakter dan 3 karakter adalah naskah Anda mungkin tidak bekerja di semuased
s Anda mungkin harus melakukan:sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
. Jawaban Anda juga melesetID: [0-9]
pada baris pertama yang berisi dua kejadianID: [0-9]
.Gunakan grep + awk:
Bonus: mudah dibaca :)
sumber
grep
jika menggunakanawk
.awk '/^ID/ { print $2 }'
melakukan hal yang sama, dan menghindari masalah line-buffering grep . Ini juga hampir sama dengan salah satu solusi dalam jawaban @ terdon.