Saya ingin menemukan string dalam baris teks dan mencetak string (antara spasi) dan kata pertama dari frasa.
Sebagai contoh:
"Ini adalah satu baris teks" "Hal lain" "Lebih baik kamu coba lagi" "Lebih baik"
Daftar string adalah:
teks benda mencoba Lebih baik
Apa yang saya coba adalah untuk mendapatkan tabel seperti ini:
Teks [tab] ini [Tab] lain hal Itu [tab] mencoba Lebih baik
Saya mencoba dengan grep tetapi tidak ada yang terjadi. Ada saran?
command-line
text-processing
regex
Felipe Lira
sumber
sumber
Jawaban:
Versi bash / grep:
Sebut seperti ini:
Keluaran:
sumber
Perl untuk menyelamatkan!
Simpan sebagai
first-plus-word
, jalankan sebagaiItu menciptakan regex dari kata-kata input. Setiap baris kemudian dicocokkan dengan regex, dan jika ada kecocokan, kata pertama dicetak, dan jika berbeda dengan kata, kata tersebut juga dicetak.
sumber
Ini versi awk:
di mana
file2
daftar kata danfile1
berisi frasa.sumber
Inilah versi python:
Demo:
Catatan : Skrip ini
python3
kompatibel, sehingga Anda dapat menjalankannya denganpython2
ataupython3
.sumber
Coba ini:
Jika tab sebelum
Better
masalah, maka coba ini:Di atas diuji pada GNU sed (dipanggil
gsed
pada OSX). Untuk BSD sed, beberapa perubahan kecil mungkin diperlukan.Bagaimana itu bekerja
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
Ini mencari kata,
[[:alnum:]]+
diikuti oleh spasi[[:space:]]
, diikuti oleh apa pun.*
, diikuti oleh salah satu kata Andatext|thing|try|Better
, diikuti oleh apa pun. Jika itu ditemukan, itu diganti dengan kata pertama pada baris (jika ada), tab, dan kata yang cocok.ta; b; :a; s/^\t//; p
Jika perintah substitusi menghasilkan substitusi, yang berarti bahwa salah satu kata Anda ditemukan di telepon, maka
ta
perintah itu memberitahu sed untuk melompat ke labela
. Jika tidak, maka kita cabang (b
) ke baris berikutnya.:a
mendefinisikan label a. Jadi, jika salah satu dari kata-kata Anda ditemukan, kami (a) melakukan substitusis/^\t//
yang menghilangkan tab utama jika ada, dan (b) mencetak (p
) baris.sumber
Pendekatan bash / sed sederhana:
The
while read w; do ...; done < words
akan iterate atas setiap baris dalam filewords
dan simpan sebagai$w
. The-n
mereksed
tidak mencetak apa pun secara default. Thesed
perintah maka, akan menggantikan tanda kutip ganda diikuti oleh non-spasi (\"(\S*)
, tanda kurung berfungsi untuk "menangkap" apa yang cocok dengan\S*
, kata pertama, dan kami kemudian dapat menyebutnya sebagai\1
), 0 atau lebih karakter (.*
) dan kemudian kata yang kami cari ($w
) dan 0 atau lebih karakter lagi (.*
). Jika ini cocok, kami menggantinya dengan hanya kata pertama, tab dan$w
(\1\t$w
), dan mencetak baris (itulah yang dilakukanp
dis///p
).sumber
Ini adalah versi Ruby
File teks sampel
hello.txt
berisiBerjalan dengan
ruby source.rb hello.txt
hasil dalamsumber