Saya menghapus kata-kata berhenti dari sebuah teks, secara kasar menggunakan kode ini
Saya punya yang berikut ini
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
Saya mengharapkan hasilnya:
extensions
tapi saya mendapatkan (saya pikir salah)
file
extensions
Seolah-olah kata file
tersebut telah dilewati dalam file stopwords. Sekarang inilah sedikit keren: jika saya memodifikasi file stopwords, dengan mengubah satu kata / huruf i
pada baris pertama, untuk setiap huruf ascii lain selain f
, i
, l
, e
, maka perintah grep yang sama memberi saya hasil yang berbeda dan benar extensions
.
Apa yang terjadi di sini dan bagaimana cara memperbaikinya?
Saya menggunakan grep (BSD grep) 2.5.1-FreeBSD pada Mac OSX GNU bash, versi 4.4.12 (1)
-x
saklar untuk regex baris alih-alih-w
untuk kata? Namun saya pikir-F
saklar akan membatalkan salah satu dari mereka, atau sebaliknya.i
pola menjadi pola kedua dan bukan pola pertama dalamstopwords
file juga mengubah perilaku.grep
atau dengan GNUgrep
3.1.Jawaban:
Ini adalah bug dalam
bsdgrep
, berkaitan dengan variabel yang melacak bagian dari baris saat ini masih untuk memindai yang ditimpa dengan panggilan berturut-turut ke mesin pencocokan ekspresi reguler ketika beberapa pola terlibat.perbaikan lokal
Anda dapat mengatasinya sampai batas tertentu dengan tidak menggunakan
-w
opsi, yang bergantung pada variabel ini untuk operasi yang benar dan karenanya gagal, tetapi sebaliknya menggunakan ekstensi ekspresi reguler yang cocok dengan awal dan akhir kata, membuatstopwords
file Anda terlihat seperti:Penanganan masalah ini juga mengharuskan Anda untuk tidak menggunakan
-F
opsi.Perhatikan bahwa komponen ekspresi reguler yang terdokumentasi
[[:<:]]
dan[[:>:]]
bahware_format
manual memberi tahu Anda tentang tidak akan bekerja di sini. Ini karena pustaka ekspresi reguler yang dikompilasi menjadibsdgrep
memiliki dukungan kompatibilitas ekspresi reguler GNU dihidupkan. Ini adalah bug lain, yang dilaporkan diperbaiki.perbaikan layanan
Bug ini diperbaiki awal tahun ini. Perbaikan belum membuatnya menjadi rasa STABIL atau RELEASE dari FreeBSD, tetapi dilaporkan dalam CURRENT.
Untuk memasukkan ini ke versi MacOS
grep
, yang berasal dari FreeBSDbsdgrep
, silakan berkonsultasi dengan Apple. ☺Bacaan lebih lanjut
sumber
Kode ini:
menghasilkan:
Pada sistem seperti:
Lebih detail tentang cgrep, tersedia melalui minuman, dan dari sourceforge:
sorakan, drl
sumber