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?

kasar
sumber
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
dsummersl
sumber
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