Menggunakan grep untuk mencari string yang memiliki titik di dalamnya


196

Saya mencoba mencari string 0.49(dengan titik) menggunakan perintah

grep -r "0.49" *

Tetapi yang terjadi adalah saya juga mendapatkan hasil yang tidak diinginkan yang berisi string seperti 0449, 0949dll. Masalahnya adalah linux mempertimbangkan dot (.) Sebagai karakter apa saja dan mengeluarkan semua hasilnya. Tetapi saya ingin mendapatkan hasil hanya untuk "0,49".

Jawaban:


238

grepmenggunakan regex; .berarti "karakter apa saja" dalam sebuah regex. Jika Anda ingin string literal, menggunakan grep -F, fgrepatau melarikan diri .ke \..

Jangan lupa untuk membungkus string Anda dengan tanda kutip ganda. Atau yang harus Anda gunakan\\.

Jadi, perintah Anda harus:

grep -r "0\.49" *

atau

grep -r 0\\.49 *

atau

grep -Fr 0.49 *

58
Saya perlu melarikan diri dua kali agar \\.bisa bekerja. Saya menggunakan zsh.
Nikos Renieris

5
@NikosRenieris apakah Anda membungkus string grepping Anda dengan tanda kutip ganda?
Justus Romijn

@JustusRomijn saya pikir saya lakukan, ya.
Nikos Renieris

15
Anda harus menggunakan \\.bash juga, atau menggunakannya "\."untuk melarikan diri dari shell.
Tomofumi

36

grep -F -r '0.49' *memperlakukan 0,49 sebagai string "tetap" alih-alih ekspresi reguler. Ini membuat .kehilangan makna khususnya.


22

Anda harus lolos dari .as"0\.49" .

A .adalah meta-karakter regex yang cocok dengan karakter apa pun (kecuali baris baru). Untuk mencocokkan periode literal, Anda harus menghindarinya.



5

Anda juga bisa menggunakan "[.]"

grep -r "0[.]49"

5

Ada begitu banyak jawaban di sini yang menyarankan untuk melarikan diri dari titik dengan \.tetapi saya telah mengalami masalah ini berulang-ulang: \.memberi saya hasil yang sama seperti.

Namun, kedua ungkapan ini cocok untuk saya:

$ grep -r 0\\.49 *

Dan:

$ grep -r 0[.]49 *

Saya menggunakan "bash shell" normal di Ubuntu dan Archlinux.

Edit, atau, sesuai dengan komentar:

$ grep -r '0\.49' *

Catatan, tanda kutip tunggal melakukan perbedaan di sini.


3
Anda perlu mengutip regex dari shell, atau keluar dari backslash itu sendiri sehingga shell tidak mengkonsumsinya. grep '\.'atau grep \\.(saya akan sangat menyarankan yang pertama. Kutipan ganda berfungsi juga, seperti pada pertanyaan awal; tetapi tanda kutip tunggal lebih mudah dipahami dan digunakan. Misalnya, dengan tanda kutip ganda, Anda masih perlu menggandakan garis miring terbalik dalam beberapa skenario ).
tripleee

IMHO, ini adalah jawaban yang benar paling jelas, dengan komentar @tripleee itu adalah yang paling lengkap. penggunaan [] (yang berfungsi untuk mewakili subset karakter yang cocok dengan satu karakter) adalah peretasan yang bagus.
jringoot

@jringoot Serius? Saya pikir ini tidak jelas sama sekali - ini lebih mirip pertanyaan lanjutan dari seseorang yang tidak terbiasa mengutip.
tripleee

Jelas karena kedua ungkapan itu bekerja secara langsung dan memang banyak yang lain menganggap kutipan atau kebutuhan untuk menggandakan diri untuk menghindari interpretasi sekunder oleh shell sebagai hal yang sepele. Saya tidak dapat mengubah komentar lagi (batas 5 menit). Komentar saya mungkin lebih baik: "ini, jika dikombinasikan dengan komentar @tripleee itu adalah jawaban yang paling lengkap. Karena kedua perintah bekerja dengan segera dan dengan mengutipnya sudah selesai"
jringoot

1
Apa yang biasanya saya sarankan adalah "selalu kutip tunggal ekspresi reguler Anda". Ini tidak "lengkap" tetapi menyelesaikan pekerjaan dan menyiratkan Anda perlu memahami mengutip atau hidup dengan aturan sederhana ini.
tripleee


4

Anda dapat menghindari titik dan karakter khusus lainnya menggunakan \

misalnya. grep -r "0 \ .49"


Pengingat untuk pembaca masa depan, \.dikelilingi dengan tanda kutip diperlukan untuk membuatnya bekerja.
Buah

1

Anda juga dapat mencari dengan - opsi yang pada dasarnya mengabaikan semua karakter khusus dan itu tidak akan ditafsirkan oleh grep.

$ cat foo |grep -- "0\.49"
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.