tek harfli kelimelerle garip davranış


10

Kabaca bu kodu kullanarak, bir metinden stop kelimeleri kaldırıyorum

Aşağıdakilere sahibim

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

Sonuç bekliyorum: extensions

ama anladım (yanlış düşünüyorum)

file
extensions

Sanki filekelime stopwords dosyasında atlanmış gibi. Şimdi burada serin biraz: Ben tek bir kelime / harf değiştirerek, engellenecek kelimeler dosyasını değiştirirseniz idışında başka herhangi bir ASCII mektuba, ilk satırda f, i, l, e, daha sonra aynı grep komutu Bana farklı ve doğru sonucu verir extensions.

Burada neler oluyor ve nasıl düzeltebilirim?

Mac OSX GNU bash, sürüm 4.4.12 (1) üzerinde grep (BSD grep) 2.5.1-FreeBSD kullanıyorum


-xAnahtar yerine -wword yerine line regex için kullanmak isteyebilirsiniz ? Ancak -Fanahtarın ikisini de iptal edeceğini ya da tam tersini düşünüyorum.
jesse_b

grep (GNU grep) 3.1 beklediğiniz gibi çalışır.
Hauke ​​Laging

Bunu kopyaladım. Başka bir veri: iDeseni stopwordsdosyadaki ilk desen yerine ikinci yapmak da davranışı değiştirir.
JdeBP

OpenBSD 6.2'deki davranışı yerel grepveya GNU grep3.1 ile çoğaltamıyorum .
Kusalananda

Yanıtlar:


13

Bu, bsdgrepbirden çok desen söz konusu olduğunda normal ifade eşleştirme motoruna ardışık çağrılarla yazılan geçerli satırın hala taranacak kısmını izleyen bir değişkenle ilgili bir hataydı.

yerel düzeltme

-wDoğru değişkenlik için bu değişkene dayanan ve bu nedenle başarısız olan seçeneği kullanmadan, bunun yerine, sözcüğün başlangıcını ve sonlarını eşleştiren normal ifade uzantılarını kullanarak, stopwordsdosyanızın aşağıdaki gibi görünmesini sağlayarak bir dereceye kadar çalışabilirsiniz :

\ <İ \>
\ <File \>
\ <Tipleri \>

Bu geçici çözüm, -Fseçeneği kullanmamanızı da gerektirir .

O Not belgelenmiş düzenli ifade bileşenleri [[:<:]]ve [[:>:]]bu re_formatmanuel söyler hakkında olacak değil burada çalışıyorum. Bunun nedeni, derlenen normal ifade kitaplığında bsdgrepGNU düzenli ifade uyumluluğu desteğinin açık olmasıdır. Bu, başka bir hatadır, bildirilmiştir.

servis düzeltmesi

Bu hata bu yılın başlarında düzeltildi. Düzeltme henüz FreeBSD'nin STABLE veya RELEASE lezzetleri haline getirmedi, ancak CURRENT'te bildirildi.

Bunu grepFreeBSD'lerden türetilen MacOS sürümüne almak için bsdgreplütfen Apple'a danışın. ☺

daha fazla okuma


Güzel ve bunu yukarı yönde bildirdiğiniz için teşekkürler. Ben buggy kodu alıntı eğer bu cevabı daha büyüleyici bulurdum.
dhag

1

Bu kod:

pl " Input data file data1 and stopwords file data2:"
head data1 data2

pl " Expected output:"
cat $E

pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1

pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1

üretir:

-----
 Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions

==> data2 <==
i
file
types

-----
 Expected output:
extensions

-----
 Results, grep:
file
extensions

-----
 Results, cgrep:
extensions

Gibi bir sistemde:

OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution        : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57

Demleme hakkında ve demleme yoluyla sunulan cgrep hakkında daha fazla bilgi:

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : Mach-O64-bitexecutablex86_64 ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

alkış, drl


kendime yeni bir grep kazandım.
Tim

@Tim - Umarım cgrep'i benim kadar faydalı bulursun. Yaptığım testlerin hızı kabaca GNU grep ile eşitti ve "bağlam / pencereleme" özellikleri çok faydalı. Ayrıca Linux sistemlerinde de kolayca kurulur ... şerefe, drl
drl
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.