Kasus spesifik `grep` yang tidak rakus


1

Saya tahu ada banyak contoh regex non-serakah dengan grep, tapi saya mengalami masalah dengan kasus spesifik saya.

File saya berisi baris yang mirip dengan:

[X12345.Yabc.Z7989].[ALPHA/BRAVO].[CHARLIE.DELTA]

dan saya mencoba untuk menguraikan X12345bagian yang tepat.
Artinya, bagian dimulai dengan Xdan sampai periode pertama ( .)

Contoh terdekat saya sejauh ini adalah:

grep -Eo "X(.*?)\."  inputfile

Tapi itu terlalu serakah (meskipun saya pikir saya menggunakan .*?dengan benar.

Dapatkah seseorang membantu membimbing saya ke regex yang tepat?


mengapa grep? Ini terdengar seperti pekerjaan untuk cut -d '.' -f1 | cut -d '[' -f2, bagiku.
Sirex

Jawaban:


2

Anda menggunakan .*dengan benar tetapi karena Anda perhatikan itu rakus memakan sebanyak mungkin karakter dalam pertandingan Anda karena .cocok dengan karakter apa pun. Anda bisa melakukannya:

grep -Eo "X([^.]*?)\." inputFile

Ini cocok dengan X diikuti dengan urutan panjang sembarang titik ( [^.]*) hingga beberapa karakter ( ?) dan titik ( \.). Anda mengatakan bahwa Anda tertarik pada segala hal antara X pertama dan pertama. namun, sehingga Anda dapat menyederhanakan ini lebih lanjut:

grep -Eo "X[^.]*\." inputFile

Itu masuk akal. Jika saya tahu yang berikut Xini hanya berupa digit, apakah ungkapan ini berfungsi? "X [0-9] + \." (Saya akan mencoba semua ini ketika saya sampai di kantor besok)
abelenky

ya, itu juga akan berhasil. Umumnya semakin ketat Anda semakin cocok. Selain itu saya belum pernah melihat -osaklar yang digunakan dengan grep sebelumnya (belajar sesuatu setiap hari!). Biasanya saya menggunakan sed untuk sesuatu seperti ini. Dalam sed akan tampak seperti ini: sed -E 's/^.*(X[^.]*\.).*$/\1/' inputFile.
dsummersl

Terima kasih. Adakah alasan khusus untuk preferensi sed -Elebih grep -Eo?
abelenky

Kebiasaan, jujur. Yang mengatakan, Anda dapat mencapai lebih banyak dengan sed daripada grep. Ini mencari / menggantikan satu baris juga di beberapa baris input Anda. Misalkan Anda ingin memfilter semua pola 'foobar' dalam file dan kemudian memindahkan foo dengan bar (barfoo). Anda bisa melakukannya dengan sed, tetapi tidak grep:sed -E 's/(foo)(bar)/\2\1/' inputFile
dsummersl

Tampaknya ada perbedaan penting dalam cara mereka beroperasi: sed memungkinkan semuanya melalui, hanya memproses apa yang cocok. grep memblokir semuanya, hanya mengizinkan yang cocok.
abelenky
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.