Jika Anda memiliki GNU grep (selalu di Linux dan Cygwin, kadang-kadang di tempat lain), Anda dapat menghitung baris output darigrep -o
: grep -o needle | wc -l
.
Dengan Perl, berikut adalah beberapa cara yang saya anggap lebih elegan dari milik Anda (bahkan setelah diperbaiki ).
perl -lne 'END {print $c} map ++$c, /needle/g'
perl -lne 'END {print $c} $c += s/needle//g'
perl -lne 'END {print $c} ++$c while /needle/g'
Dengan hanya alat POSIX, satu pendekatan, jika mungkin, adalah membagi input menjadi garis dengan satu kecocokan sebelum meneruskannya ke grep. Misalnya, jika Anda mencari seluruh kata, maka pertama-tama ubah setiap karakter non-kata menjadi baris baru.
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
Kalau tidak, tidak ada perintah standar untuk melakukan sedikit pemrosesan teks ini, jadi Anda perlu beralih ke sed (jika Anda seorang masokis) atau awk.
awk '{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}}
END {print c}'
sed -n -e 's/set/\n&\n/g' -e 's/^/\n/' -e 's/$/\n/' \
-e 's/\n[^\n]*\n/\n/g' -e 's/^\n//' -e 's/\n$//' \
-e '/./p' | wc -l
Berikut adalah solusi yang lebih sederhana menggunakan sed
dan grep
, yang berfungsi untuk string atau bahkan oleh-the-book ekspresi reguler tetapi gagal dalam beberapa kasus sudut dengan pola berlabuh (misalnya menemukan dua kemunculan ^needle
atau \bneedle
dalam needleneedle
).
sed 's/needle/\n&\n/g' | grep -cx 'needle'
Perhatikan bahwa dalam substitusi sed di atas, yang saya \n
maksud adalah baris baru. Ini adalah standar di bagian pola, tetapi dalam teks pengganti, untuk portabilitas, gantikan backslash-newline untuk \n
.
grep
ditentukan, tetapi bagi siapa pun yang menggunakanack
, jawabannya sederhanaack -ch <pattern>
.