Untuk input yang diberikan ini:
How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this
Saya ingin hasil ini:
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one
Mendapatkan seluruh baris hanya mengandung tiga kata "ini" yang diulang. (kecocokan huruf besar-kecil)
text-processing
αғsнιη
sumber
sumber
$RANDOM_LANGUAGE
- seseorang akan dapat menemukan solusi di dalamnya.Jawaban:
Dalam
perl
, gantithis
dengan dirinya sendiri case-insensitive dan hitung jumlah penggantian:Alih-alih menggunakan hitungan kecocokan :
Jika Anda memiliki GNU awk, cara yang sangat sederhana:
Jumlah bidang akan lebih dari jumlah pemisah.
sumber
Dengan asumsi file sumber Anda adalah tmp.txt,
Grep kiri menampilkan semua baris yang tidak memiliki 4 atau lebih kejadian case-insensitive dari "this" di tmp.txt.
Hasilnya disalurkan ke grep kanan, yang menampilkan semua baris dengan 3 kejadian atau lebih di hasil grep kiri.
Pembaruan: Berkat @Muru, ini adalah versi yang lebih baik dari solusi ini
ganti 4 dengan n + 1 dan 3 dengan n.
sumber
grep
harus diakhiri*
.this
.grep -iv '.*this.*this.*this.*this.*' tmp.txt | grep -i '.*this.*this.*this.* |grep -iv '.*this.*this.'
grep -Eiv '(.*this){4,}' | grep -Ei '(.*this){3}'
- ini mungkin membuatnya praktis untuk N = 50.Dalam python, ini akan melakukan pekerjaan:
output:
Atau untuk membaca dari file, dengan file sebagai argumen:
Rekatkan skrip ke file kosong, simpan sebagai
find_3.py
, jalankan dengan perintah:Tentu saja kata "ini" dapat diganti dengan kata lain (atau bagian string atau baris lainnya), dan jumlah kemunculan per baris dapat diatur ke nilai lain apa pun di baris:
Edit
Jika file berukuran besar (ratusan ribu / jutaan baris), kode di bawah ini akan lebih cepat; itu membaca file per baris alih-alih memuat file sekaligus:
sumber
Anda dapat bermain sedikit dengan
awk
ini:Ini mengembalikan:
Penjelasan
Apa yang kita lakukan adalah mendefinisikan pemisah bidang
this
itu sendiri. Dengan cara ini, baris tersebut akan memiliki banyak bidang +1 sebanyak kali kata tersebutthis
muncul.Untuk membuatnya tidak sensitif, kami menggunakan
IGNORECASE = 1
. Lihat referensi: Sensitivitas Huruf dalam Pencocokan .Kemudian, itu hanya masalah mengatakan
NF==4
untuk mendapatkan semua kalimat ituthis
tepat tiga kali. Tidak diperlukan lagi kode, karena{print $0}
(yaitu, cetak baris saat ini) adalah perilaku defaultawk
ketika ekspresi dinilaiTrue
.sumber
Dengan asumsi garis disimpan dalam file bernama
FILE
:sumber
sed ...
perintah dan menambahkan-o
opsi untukgrep -oi ...
gantinya.$(grep -ic "this" <<<"$line")
-c
opsi akan menghitung jumlah baris yang cocok dengan kata-kata "ini" bukan jumlah "ini" di setiap baris.-l
dan-w
akan setara dalam kasus ini?Jika Anda berada di Vim:
Ini hanya akan mencetak garis yang cocok.
sumber
Solusi Ruby satu-liner:
Bekerja dengan cara yang cukup sederhana: kami mengarahkan file ke stdin ruby, ruby mendapat garis dari stdin, membersihkannya dengan
chomp
dandowncase
, danscan().count
memberi kami jumlah kemunculan substring.sumber