Jawaban aman distribusi silang (termasuk windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Jika Anda menggunakan versi grep yang lebih lama (seperti 2.4.2) yang tidak termasuk opsi -o. Gunakan yang di atas. Lain gunakan yang lebih sederhana untuk mempertahankan versi di bawah ini.
Linux cross distribution jawaban aman
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Untuk merangkum -oh
output ekspresi reguler cocok dengan konten file (dan bukan nama file), sama seperti bagaimana Anda mengharapkan ekspresi reguler bekerja di vim / etc ... Apa kata atau ekspresi reguler yang akan Anda cari, terserah kamu! Selama Anda tetap ke POSIX dan bukan sintaks perl (lihat di bawah)
Lebih banyak dari manual untuk grep
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
Alasan mengapa jawaban awal tidak bekerja untuk semua orang
Penggunaan \w
bervariasi dari platform ke platform, sebagai sintaks "perl" yang diperpanjang. Dengan demikian, instalasi grep yang terbatas untuk bekerja dengan kelas karakter POSIX menggunakan [[:alpha:]]
dan tidak setara dengan perl \w
. Lihat halaman Wikipedia pada ekspresi reguler untuk lebih lanjut
Pada akhirnya, jawaban POSIX di atas akan jauh lebih dapat diandalkan terlepas dari platform (menjadi yang asli) untuk grep
Sedangkan untuk dukungan grep tanpa opsi -o, grep pertama menampilkan garis yang relevan, tr membagi spasi ke baris baru, filter grep akhir hanya untuk masing-masing baris.
(PS: Saya tahu sebagian besar platform sekarang, pasti telah ditambal untuk \ w .... tetapi selalu ada yang tertinggal)
Penghargaan untuk solusi "-o" dari jawaban @AdamRosenfield