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 X12345
bagian yang tepat.
Artinya, bagian dimulai dengan X
dan 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?
Jawaban:
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: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:sumber
X
ini hanya berupa digit, apakah ungkapan ini berfungsi? "X [0-9] + \." (Saya akan mencoba semua ini ketika saya sampai di kantor besok)-o
saklar 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
.sed -E
lebihgrep -Eo
?sed -E 's/(foo)(bar)/\2\1/' inputFile