Satır başı ^ bağlantısı, neden satır başı ^ bağlantısı olsa da grep komutuyla çalışmıyor?


19

UNIX için çok yeni, ancak programlama için yeni değil. MacBook'ta Terminal kullanma. Bulmaca yapımı için kelime listelerini yönetmek ve aramak amacıyla, Grep komutu ve varyasyonları ile kullanışlı olmaya çalışıyorum. Oldukça basit görünüyor, ancak basit bir durum olması gerektiğini düşündüğüm şeyle erken takılmak.

Girdiğimde

grep "^COW" masternospaces.txt

İstediğimi anlıyorum: COW ile başlayan tüm kelimelerin listesi.

Ama girdiğimde

grep "COW$" masternospaces.txt

COW (bu kadar çok kelime var) ile biten kelimelerin bir listesini almayı bekliyorum ve hiçbir şey geri dönmüyor.

Dosya düz bir metin dosyasıdır ve her satırda tüm büyük harflerde bir kelime (veya boşluk içermeyen bir kelime öbeği) bulunur.

Burada neler olabileceğine dair bir fikrin var mı?


3
Masternospaces.txt dosyasının kökeni nedir? Unix tarzı LF'ler yerine Windows tarzı satır sonlandırmaları (CR-LF) olabilir mi?
steeldriver

2
Emin değilsiniz, ama bir liste kelimesi veya satır listesi mi arıyorsunuz?
mikeserv

steeldriver-- Böyle bir şey ilk düşüncemdi. Orada olup bitenleri ve hatta olasılıkları nasıl inceleyeceğimizden emin değildim. Bir son dönüşün bir son dönüş olduğu varsayılmıştır. Bu dosya birkaç kaynaktan gelen devasa bir özet. Hangisinin orijinal dosya olarak kabul edileceğinden bile emin değilim. Hem PC hem de Mac makinelerinde en az üç kelime işlemciden geçti. Ne tür bir sonlandırma kullandığını görmenin en iyi yolu ne olabilir?
DTalvacchio

mikeserv-- Bu .txt dosyasında, her satır sadece bir kelimedir (veya kelimeler arasında boşluk bulunmayan bir cümledir, bu yüzden yine bir "kelime"). Sanırım çizgileri arıyorum. . . sadece her satırda bulmaca amaçlı bir kelimeyi düşündüğüm şeylerden sadece biri var.
DTalvacchio

1
hexdumpSatır uçlarınızın tam olarak nasıl biçimlendirildiğini kontrol etmek için kullanabilirsiniz . Ben de en favori biçimi kullanın öneririz: hexdump -e '"%08_ad (0x%08_ax) "8/1 "%02x "" "8/1 "%02x "' -e '" "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt. Çıktı ile satır sonlarını kontrol edin: 0a-> LF, 0d-> CR.
user43791

Yanıtlar:


23

@Steeldriver'ın da belirttiği gibi, sorun muhtemelen beklenenden farklı bir çizgi bitiş stilinden kaynaklanıyor olabilir grep.

Satır sonlarını kontrol etmek için

hexdumpSatır uçlarınızın tam olarak nasıl biçimlendirildiğini kontrol etmek için kullanabilirsiniz . Favori biçimimi kullanmanızı öneririm:

hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt

Çıktı ile satır sonlarını kontrol edin: 0a-> LF, 0d-> CR. Çok hızlı bir örnek şöyle bir şey verebilir:

$ hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
00000000 (0x00000000)    4e 6f 20 43 4f 57 20 65   6e 64 69 6e 67 0d 0a 45    No COW e|nding..E
00000016 (0x00000010)    6e 64 69 6e 67 20 69 6e   20 43 4f 57 0d 0a          nding in| COW..

Dos formatında satır sonlarını Not: 0d 0a.

Satır sonlarını değiştirmek için

Çeşitli araçları kullanarak çizgi sonlarını değiştirmek için çeşitli yöntemler için burada veya burada görebilirsiniz , ancak bir kerelik bir şey için her zaman vi / vim kullanabilirsiniz:

vim masternospaces.txt
:set fileformat=unix
:wq

Hiçbir şeyi değiştirmeden grep

Sadece istiyorsanız grephiçbir maç hat sonunu Maddeye, her zaman böyle satır sonları belirtebilirsiniz:

grep 'COW[[:cntrl:]]*$' masternospaces.txt

Boş bir satır gösteriliyorsa, aşağıdakiler -vseçeneğini kullanarak gerçekten bir şey eşleştirip eşleştirmediğinizi kontrol edebilirsiniz cat:

grep 'COW[[:cntrl:]]*$' masternospaces.txt | cat -v

Kişisel favorim

Ayrıca çıktıyı hem grep hem de standardize edebilirsiniz sed:

sed -n '/COW^M*$/{;s/^M//g;p;};' masternospaces.txt

nerede ^Myazarak elde edilir Ctrl-V Ctrl-Mklavyenizdeki.

Bu yardımcı olur umarım!


Hepsi son derece yararlı. Bugün zamanım kalmadı ama yarın hepsini yakından inceleyip neyin ne olduğunu göreceğiz. Bu arada herhangi birinizin en sevdiğiniz Unix komut referans kılavuzuna bir bağlantısı varsa, böylece işlerin nasıl çalıştığı hakkında kendime biraz öğretebilirim, takdir ediyorum. Burada ve orada parçalar alıyordum ama henüz açıklamalarıma giden tek bir kaynak bulamadım. Herkese teşekkürler ve yarın check-in yapmayı umuyoruz. -D-
DTalvacchio

En azından benim için bu yazının kapanması çok kötü. Hayatım boyunca, hattın sonuyla nasıl eşleşeceğini bulamıyorum. Onaltılık dökümü yaparsam, yukarıdaki örnek gibi biten hoş bir çizgi bulamıyorum. Ben hex ile çalışmaya aşina değilim, bu yüzden doğru okuma olmayabilir. Ayrıca [[:cntrl:]]@ user43791 önerilen denedim ve hala benim için hiçbir şey eşleşmiyor. Bu anlamlı değil. GNU grep 2.20 kullanıyorum ve bir metin dosyasına yazılmış nDPI çıktısını ayrıştırma
Harperville

@harperville Eğer sen cat -v yourfile.ext, ne görüyorsun?
user43791

Heyecan verici veya beklenmedik bir şey yok. Sadece içeriği görmeyi beklediğim gibi. Aradığınız belirli bir şey var mı? Çıkışı buraya yapıştıramıyorum ama sadece içeriği görüyorum. Düzenli ol '"ASCII İngilizce metin" e göre file.
harperville

@harperville Her satırın sonunda fazladan "^ M" yok mu? İlk onaltılı çizgiyi yapıştırabilir misiniz?
user43791

1

Grep ile 'standart' RegEx sözdizimini kullanabilmenize rağmen ( @ user43791'nin cevabında olduğu gibi ), grep'in giriş sınırlarını belirtmek için başka tanımlayıcıları da vardır.

Tüm çizginin başlangıcı ve bitişi için \`eşleşenler (yerine) (ters tırnak) (yerine ^) ve \'kesme işareti (yerine $) şeklindedir.

Yani orijinal komutunuz için şunları kullanırsınız: grep "COW\'" masternospaces.txt

Yan Not: Bu dikkat etmek de önemlidir ?ve +bunları kullanarak kaçmak sürece tam anlamıyla ele alınacaktır \?ve \+onlara RegEx tarzı selektör meslektaşları yapmak.

Kaynak: grepnormal ifade sözdizimi


grep başlangıç ​​için ^ (
düzeltme

1

\rGrep'ten önce kaldırmanın başka bir yolu :

... | dos2unix | egrep 'COW$' | ...

Çok [[:cntrl:]]uzun süredir hatırlamadığım için çok net .


-2

"COW $" basrep grep için parametre ayarladığında, "COW" olarak yorumlandı, burada "$" "" "olarak muamele edilir, becase $ bir kaçış erkekidir. $ ile hiçbir şey bulunmadığında, bash shell tarafından boş dize olarak yorumlanır, bunun yerine grep 'COW $' masternospaces.txt kullanmalısınız.


3
geçerli bir genişlemesi olmadığından $, bash tarafından yalnız bırakılır ve grep tarafından kullanılır. Kendiniz görün: echo "COW$"- $hala orada olacak.
Jeff Schaller

-3

BSD grep'te "$" 'dan kaçmanız ve dizenizi çift tırnak içine almanız gerekir:

"COW\$"

1
Um ... hayır. $Ondan sonra malzeme geçerli bir kabuk değişken adı olmadığı için, kabuğuna özel olmayacaktır. Statik dizelerin etrafında tek tırnak kullanmak daha iyi bir fikirdir, ancak burada hiçbir fark yaratmayacaktır.
Kusalananda
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.