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.