Grep ile bir satırın sonundaki kalıbı algılama


64

Eğer yaparsam:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part

.rarSadece dosyaları listelemek istersem ve grep kullanırsam , bana da .rar.partdosyaları gösterecek , isteğim ne değil.
Bunu kullanarak findveya bu başlıktals **/*.rar söylendiği gibi çözüyorum ve iyi çalışıyorlar, ancak bunu yapmanın mümkün olup olmadığını öğrenmek istiyorum grep.

(Düşünerek EOL) denedim :

ls -R | grep ".rar\n"

sonuçsuz.
Sanırım sorunun sonunda , ızgara çizgisinin sonunda bulunup bulunmadığı tespit ediliyor , ama emin değilim.

Herhangi bir yardım, lütfen?


grepBu durumda neden kullanmak istersin ? Neden olmasın find?
devnull

1
@devnull, sadece bir satırın sonundaki kalıpların nasıl algılandığını bilmek birçok durumda yararlı olabilir. Örneğin: taşınabilirlik, çok basit gömülü Linux'lu yönlendiricilerde kullanım, Windows için UnxUtils ile kullanımı ( findkomutu Windows ile çakışıyor) ve ... learning ;-). Buradaki soru "Dosyaları bir
dizinde listelemek

1
dürüst olmak gerekirse, ayırıcınız olarak bir çizginin sonuna güveniyorsanız, kullanmanız gerekir ls -1R.
mikeserv

1
Ve ihtiyacın bile yok grep. Cevabımı gör.
mikeserv

@mikeserv, -1Ranahtar olmadan ne olabilirdi . Görünüşe göre sonuçlar aynı.
Sopalajo de Arrierez

Yanıtlar:


88

$Çapa bir satırın sonuyla eşleşir.

ls -R | grep '\.rar$'

Bunun için de kullanabilirsiniz find:

find . -name '*.rar'

"" Un farkında değildim. grep kaçmak gerekiyor. Joker kart olarak mı kabul edilir?
thebunnyrules 13:18

1
@ thebunnyrules "." regex'te herhangi bir karakterden biri anlamına gelir.
jordanm

10

Sorunuza ek olarak, lütfen .raryalnızca ".rar" ile eşleşmediğini, aynı zamanda her bir karakterle (dahil .) eşleştiğini unutmayın rar. Bu durumda büyük olasılıkla bir sorun değil ama .regex'lerde kaçılmalıdır.

ls -R | grep "\.rar$"

Bunu mu demek istediniz .ascgibidir *ascdesen? Böylece eşleşecek, örneğin whereverasc.
Sopalajo de Arrierez

2
@SopalajodeArrierez Hayır, her karakter grubuyla eşleşmez, örneğin her karakterle eşleşir xrar.
Hauke ​​Laging

5

Ayrıca grep, bir kelime sınırından başlayarak dizginizi aramak için talimat verebilirsiniz. A .bu sınırlardan bir tanesidir.

$ ls -R | grep '\brar$'

Örnek

Diyelim ki bu örnek verilere sahibim.

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part

Bu komut sadece .raruzantılı bir dosya bulur .

$ ls -R | grep '\brar$'
afile.rar

Bu nasıl çalışıyor?

Meta karakter \b, şapka ve dolar işareti gibi bir çapadır. "Sınır kelime" olarak adlandırılan bir konumda eşleşir. Bu eşleşme sıfır uzunluktadır.

Bunun işe yaramayacağı durumlar

Eğer adlandırılmış dosyalarınız varsa blah-rarbunlar da algılanacaktır.

$ ls -R | grep '\brar$'
afile-rar
afile.rar

Bunun nedeni, alfanümerik olmayan karakterlerin genellikle sınır karakterleri olarak kabul edilmeleridir ve bu yaklaşımın ötesine geçerler.


İlk bakışta aynı gözüküyor, ama aslında biraz farklı. Sağol, @slm. "Basit tırnak işaretleri yerine çift ​​tırnak işaretleri kullanmam rahatsız olur mu?
Sopalajo de Arrierez

1
@SopalajodeArrierez - hayır ya iki yönlü çalışır. Bu, w / ile adlandırılmış olabilecek herhangi bir dosyayı bulacaktır .rar. Ancak bunlar kullanımı ile ilgili bir sorun olmayacak ls -R. Sadece kullanmak için olsaydı ls -Ra.
slm

Biriniz bu küçük farkı halka açıklamakla ilgilenir mi?
Hauke ​​Laging

@HaukeLaging -Pgeçiş grepbenim örnekte. Bu, PCRE argümanının yorumlanmasını tetikler.
slm

1
@SopalajodeArrierez - Bir dosya \nyasal bir karakter olan newline karakterini ( ) içeriyorsa . Bu ls -1R, dosyaları ne olursa olsun tek bir sütunda görüntülenmeye zorlar.
slm

0

Sadece yap :

ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"

Hiç ihtiyacın yok grep.

NOT: Yukarıdakiler işe yarıyor ... en azından hala en azından alıyorafile-rar ve nedenini anlamıyorum. Onu burada bırakacağım ama bununla gurur duymuyorum. Her durumda, başkalarının söylediği gibi:

find . '*.rar'

Bu xrarveya adlı dosyaları engellemedi afile-rar.
slm

Hala çıktıdaki diğer dosyaları alıyorum.
slm

@slm Başka hangi dosyalar var? Bence çok kısa oldukları için olabilir. Sadece kendim farkettim. Bunu ben de düzelttim.
mikeserv

Dosyaları afile-rarve xrarhala çıktıya dahil ediliyor. Son modlarınızda da değişiklik yok. Sinir bozucu sorun yok mu? Düzenli yöntemler olmadan çözmeye çalışmak eğlencelidir 8-)
slm

@slm Evet, bu yüzden buraya geldim. Neden -dashgeçtiğini anlamıyorum . xrarŞey ele verebilir, ama -dash.anlamıyorum-dash.
mikeserv

0

$ Çalışmasını satır sonu olarak yapmak için tek tırnak kullanın. Bazı değişkenlerle de grep yapmak istiyorsanız, aşağıdaki gibi çift ve tek tırnak kombinasyonunu kullanın:

grep "$var"'$'

Önceki yayınım, kopya olduğunu söyleyerek silindi. Bunun nasıl farklı olduğunu açıklayayım.

Diğer yazılar, çift tırnakların ""tam kullanımını veya tek tırnakların tam kullanımını belirtir ''. Her ikisinin de kendi sınırlamaları vardır. Aşağıdaki açıklar.

Tüm çift tırnak işaretleri ile ilgili sorun aşağıdaki gibidir: grep "pattern$"Aşağıdaki hatayı verir:Illegal variable name.

Ve tüm tek tırnak kullanarak çalışır, ancak değişken değişimi istiyorsanız, tüm tek tırnak olacak değil çalışır. Örneğin:

A_BOOKDosyadaki diğer dizeler de dahil olmak üzere dize varsa DOSYA.

$ cat FILE
A_BOOK
B_BOOK_NOT_LAST
C_BOOK

KİTABI BK değişkenine ayarladıysam

set BK = BOOK

Tüm çift tırnak işaretleriyle grep yaparsam şu hatayı alıyorum:: grep "${BK}$" FILE*Değişken değiştirme için 1 $, desen sonu için 2. ( Geçersiz değişken adı ).

Tüm tek tırnak işaretleriyle aşarsam, değişken değiştirme gerçekleşmez. grep '${BK}$' FILEhiçbir şey döndürmez

İkili ve tekli tırnakların bir kombinasyonunu kullanırsam beklediğim şeyi alırım. Değişken değiştirme için çift tırnak işareti ve desen sonu için tek tırnak işareti.

$ grep "${BK}"'$'  # << gives expected output
A_BOOK
C_BOOK

Csh kullanıyor gibisin. "foo$"Sözdizimi sh ve ailesi üzerindeki çalışıyor.
Olorin

Evet Olorin. Tcsh kullanıyorum. Bunu gösterdiğin için teşekkürler.
user274900

0

Yukarıdakileri takip ettikten sonra hiçbir şey işe yaramazsa, bunun sonucunda satır sonları olabilir. Düzeltmek için: yapın dos2unix pr0n.txtve greptekrar yapın.

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.