UNIX'te grep'in garip davranışı


2

Komutu yazdığımda

$ grep \\\\h junk  

o zaman kabuk yorumlamalıdır \\\\h gibi \\h - iki çift olarak \\ her olmak \ . grep sırayla yorumlamalıdır \\h gibi \h gibi \\ olur \, yani grep kalıbı aramalı \h içinde junk, başarıyla yapıyor.

Ama bunun için çalışmıyor \\\\$. Niye ya?


superuser.com'da daha iyi
YOU

değil $ bazı özel semboller de var mı? Deneyin \\\$

1
@Draco Ne yazık ki yeterli değil, kabuğun ilk sopayı ters eğik çizgi karakterlerine karşı alacağını unutma ... ki bu da \\ $ 'ı \ $' a çevirir, ki grep sonra EOL sembolü olarak yorumlanır.
David

@Happy: Tamam, farkı gördüğüme inanıyorum. Bu soruda ve diğerinde. yeniden açılması. lütfen düzenlemelerimin ne demek istediğinizi kontrol edip etmediğinizi kontrol edin - kod blokları (4-boşluk girintisi) ve string değişmezleri (backticks) için markdown biçimlendirmesini kullandım, böylece yazmak zorunda kalmazsınız \\\\\\\\h Sadece görmek için \\\\h. Umarım sayıları doğru almışımdır.
quack quixote

Kullanmayı deneyin echo hangi girdilerin girdiğini görmek için grep. yani echo \\\$ çıktısını verecek \$.
Kevin Panko

Yanıtlar:


6

Dolar işareti olan satırları döndürmek için kaçmadan bir başka yol:

grep "[$]" file

Kelimenin tam anlamıyla satırları bulmak \$:

grep "[\][$]" file

Çok hoş! Bash olarak test etmek için tırnak işaretleri de gerekmez!
David

2

Yalnızca içinde dolar işareti olan satırları döndürür.

grep "\\$" application/bootstrap.php

$, Bir regex komutu olduğu için (satırın sonunda), kabuğunuzu geçip grep içine çift eğik çizgi koymak için bunu alıntı yapmanız gerekir.


1

Grep her zaman bir sonraki karakteri alıntı yapmak için \ kullanır, bu yüzden \ h, "h" özel "olmadığı için örneğinizde h olur:

$ cat file
\a
a

$ grep \\a file
\a
a

$ grep \\\\a file
\a

Son örneğinizde olduğu gibi, grep \ a, a'yı arar, \ $ için aranmamalı, çünkü kabuk grep'i \\ $ olarak geçirir ve grep bunu \ $ 'a dönüştürür. doğrumuyum?
Happy Mittal

Diğerlerinin de belirttiği gibi, $ dizgenin sonuna denk gelir, bu yüzden alıntı yapmanız gerekir. '\ $' İki karakterini aramak istiyorsanız grep ihtiyacı var. \\\$, ve kabuk için alıntı size verir \\\\\\$

1

Desen: '$' karakteriyle eşleşmeye çalıştığınızı varsayalım:

[$]

Birden fazla karakter kaçağı seviyesine karışmadan belirtmenin en kolay yoludur. Veya iki karakteri eşleştirmeye çalışıyorsanız: '\ $', sonra

[\\] [$]

yapacağım.


1

\ h grep için özel bir kaçış değil, bu yüzden '\ h' yaptığı bir dosyada \ h bulmalı. Kabuk, ilkini \ grep görmeden önce \ özel olduğundan kaldırır (tür ls \\ ve diyor ki: s:: Yani böyle bir dosya veya dizin). Bir dosyadaki "\ h" ile eşleşmesi için, ilkini önlemek için grep \ h veya '\ h' kullanın \ - & gt; \ kabuk tarafından azaltma.

Şimdi \ $: \ kabuk tarafından \ 'a indirgenir ve grep \ $' ı görür ve $ regex'lerde (+,., * Vb. Gibi) özel olduğundan, \ $ basit bir sınama dosyası göstereceği gibi gerçek bir dolar işaretidir. sen. Re_format (7) için kılavuz sayfasına bakınız. Yani bu tüm satırları dolar işareti ile eşleştirir.

Bu nedenle, bir dosyadaki "\ $" değişmezini eşleştirmek istiyorsanız, şunu düşünmemiz gerekir: \ $ değişmezce $, ve \ to: try ls \\\$' and you get "ls: \$: No such file or directory". So in grep \\ $ dosya , grep sees \$ and interprets that as $ again... So we want grep to see \\\$ (which it will unescape again to \$), so we can put single quotes around that and avoid headaches, or escape all the special characters for the shell too: grep \\\ $ $ `. Bu çalışıyor.

Bu yüzden neredeyse her zaman ilk grep argümanının etrafına tek bir alıntı koydum, bu yüzden sadece grep'in ne yapacağını düşünmek zorundayım, kabuk hakkında da değil.


0

Kabuğunuz yorumluyor \\ gibi \, ve $ değişken isimleri gibi bazı kontrol dizilerinin ilk karakteri olarak. bu nedenle \\\\ kabuğunuz tarafından değişmez olarak yorumlanır \\ (düşündüğünüz gibi), ama $ edebi karakter olarak yorumlanmak için kaçmak gerekir. kullanım \\\\\\\$ (yedi ters eğik çizgi) veya '\\\$' (Kesme işareti içindeki metin kelimenin tam anlamıyla kabuk tarafından yorumlanır).


üzgünüm yanlışlıkla yanlış bir soru yazdım. Şimdi düzenlemiştim. Lütfen cevabı açıkla.
Happy Mittal

Ancak, ne \\\\ $ (beş ters eğik çizgi) ile ne de '\\ $' ile çalışmak değildir.
Happy Mittal

2
Lütfen tekrar üretilebilir bir durumda "çalışmama" durumunu açıklayınız. yani, "grepping" olduğunuz dosyayı, ne komutunu çalıştırdığınızı, hangi sonucu elde edeceğinizi beklemiyorsunuz.
jlliagre

0

Neden yapamazsın grep '\\$'? Tek tırnak, neredeyse tüm enterpolasyonu önler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.