Sangat baru untuk UNIX tetapi tidak baru untuk pemrograman. Menggunakan Terminal di MacBook. Untuk keperluan mengelola dan mencari daftar kata untuk konstruksi teka-teki silang, saya mencoba untuk membiasakan diri dengan perintah Grep dan variasinya. Tampaknya cukup mudah tetapi menutup telepon dengan apa yang saya pikir seharusnya menjadi kasus sederhana.
Ketika saya masuk
grep "^COW" masternospaces.txt
Saya mendapatkan apa yang saya inginkan: daftar semua kata yang dimulai dengan SAP.
Tapi saat aku masuk
grep "COW$" masternospaces.txt
Saya berharap untuk mendapatkan daftar kata yang diakhiri dengan SAP (ada banyak kata seperti itu), dan tidak ada yang dikembalikan sama sekali.
File tersebut adalah file teks biasa, dengan setiap baris hanya sebuah kata (atau frase kata tanpa spasi) di semua huruf besar.
Adakah yang bisa terjadi di sini?
hexdump
untuk memeriksa dengan tepat bagaimana akhir baris Anda diformat. Saya sarankan Anda menggunakan format favorit saya:hexdump -e '"%08_ad (0x%08_ax) "8/1 "%02x "" "8/1 "%02x "' -e '" "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
. Dengan output, periksa ujung garis:0a
->LF
,0d
->CR
.Jawaban:
Seperti yang disebutkan @steeldriver, masalah ini kemungkinan disebabkan oleh gaya garis akhir yang berbeda dari yang
grep
diharapkan.Untuk memeriksa ujung garis
Anda dapat menggunakan
hexdump
untuk memeriksa dengan tepat bagaimana akhir baris Anda diformat. Saya sarankan Anda menggunakan format favorit saya:Dengan output, periksa ujung garis:
0a
->LF
,0d
->CR
. Contoh yang sangat cepat akan memberikan sesuatu seperti ini:Catatan akhir baris dalam format dos:
0d 0a
.Untuk mengubah akhir baris
Anda bisa lihat sini atau di sini untuk berbagai metode mengubah akhir baris menggunakan berbagai alat, tetapi untuk satu kali, Anda selalu dapat menggunakan vi / vim:
Untuk grep tanpa mengubah apa pun
Jika Anda hanya ingin
grep
mencocokkan apa pun akhir baris, Anda selalu bisa menentukan akhir baris seperti ini:Jika baris kosong ditampilkan, Anda dapat memeriksa bahwa Anda memang cocok dengan sesuatu menggunakan
-v
opsicat
:Favorit pribadi saya
Anda juga bisa grep dan standarisasi output menggunakan
sed
:dimana
^M
diperoleh dengan mengetikCtrl-V Ctrl-M
di keyboard Anda.Semoga ini membantu!
sumber
[[:cntrl:]]
disarankan @ user43791 dan masih tidak cocok dengan apa pun untuk saya. Ini tidak masuk akal. Saya menggunakan GNU grep 2.20 dan mem-parsing output dari nDPI yang ditulis ke file tekscat -v yourfile.ext
, apa yang Anda lihat?file
.Meskipun Anda dapat menggunakan sintaks RegEx 'standar' dengan grep (seperti pada jawaban @ user43791 ), grep juga memiliki pengidentifikasi lain untuk menandai batas input.
Pencocokan untuk awal dan akhir seluruh baris adalah
\`
(backtick) (bukan^
) dan\'
(apostrof) (bukan$
).Jadi untuk perintah asli Anda, Anda akan menggunakan:
grep "COW\'" masternospaces.txt
Catatan: Penting juga untuk dicatat bahwa
?
dan+
akan diperlakukan secara literal kecuali Anda menghindarinya menggunakan\?
dan\+
menjadikannya sebagai mitra pemilih gaya RegEx.Sumber:
grep
sintaks ekspresi regulersumber
Cara lain untuk menghapus
\r
sebelum grep:Saya suka itu sangat jelas karena saya tidak ingat hal-hal seperti
[[:cntrl:]]
lama.sumber
"COW $" ketika bash mengatur pararameter untuk grep, itu ditafsirkan sebagai 'COW' di mana memperlakukan "$" sebagai "", karena $ adalah simbol pelarian. ketika tidak ada yang dihasilkan oleh $, itu ditafsirkan sebagai string kosong oleh bash shell jadi, Anda harus menggunakan grep 'COW $' masternospaces.txt sebagai gantinya.
sumber
$
, itu akan dibiarkan oleh bash dan digunakan oleh grep. Lihat sendiri:echo "COW$"
-$
masih akan ada di sana.Di BSD grep Anda harus keluar dari "$" dan lampirkan string Anda dalam tanda kutip ganda:
sumber
$
akan khusus untuk shell, karena barang-barang setelah itu bukan nama variabel shell yang valid. Menggunakan tanda kutip tunggal di sekitar string statis adalah ide yang lebih baik, tetapi tidak akan membuat perbedaan di sini.