Misalnya, kami ingin menghitung semua "
karakter kutipan ( ); kami hanya khawatir jika file memiliki lebih banyak kutipan dari yang seharusnya.
Sebagai contoh:
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"
hasil yang diharapkan:
16
text-processing
yael
sumber
sumber
Jawaban:
Anda dapat menggabungkan
tr
(menerjemahkan atau menghapus karakter) denganwc
(hitung kata, garis, karakter):(
-d
hapus semua karakter dalamc
omplement of"
, dan kemudian hitung karakterc
.)sumber
pendekatan grep :
-o
- Output hanya cocok dengan substringAtau dengan melongo :
RS=''
- pemisah rekaman kosong (bukan baris baru)FPAT='"'
- pola mendefinisikan nilai bidangsumber
-o
adalah ekstensi GNU non-standar kegrep
utilitas standar . Itu tidak disebutkan dalam dokumentasi POSIX untukgrep
.Jika dua baris dalam file memiliki jumlah tanda kutip ganda ganjil, jumlah total tanda kutip ganda akan genap, dan Anda tidak akan mendeteksi tanda kutip tidak seimbang (ini yang saya anggap ingin Anda lakukan, tapi saya mungkin salah ).
awk
Skrip ini melaporkan setiap baris di baris input yang memiliki jumlah penawaran ganjil:Kami mengatur pemisah lapangan (
FS
) untuk"
dengan-F'"'
yang berarti bahwa jika garis memiliki jumlah yang lebih dari bidang memiliki tanda kutip aneh.NF
adalah jumlah bidang dalam catatan terkini, danNR
merupakan nomor urut dari catatan saat ini ("nomor baris").Diberikan input berikut:
kita mendapatkan
Sesuatu seperti
akan mengembalikan "14" untuk file ini.
sumber
gawk
Pendekatan tunggal lainnya :sumber
BASH murni:
sumber
tmp
array? Jika ya,tmp
apakah array dari apa?tmp
dalam cuplikan ini adalah variabel shell normal. Dan saya downvoting jawaban ini karena ini menghitung berapa kali karakter muncul dalam variabel (var
) daripada dalam file seperti yang ditentukan dalam pertanyaan.mencoba:
Namun, ini tidak akan berfungsi jika dua atau lebih char di baris yang sama. Mereka akan dihitung sebagai satu char
sumber
grep -oF '"' file | wc -l
-F adalah singkatan dari fixed string
sumber
-F
benderanya, yang tidak diperlukan di sini.Metode GNU ganda eksentrik
grep
:sumber