Saya memiliki perintah, misalnya: echo "word1 word2"
. Saya ingin meletakkan pipa ( |
) dan mendapatkan kata1 dari perintah.
echo "word1 word2" | ....
Saya tidak tahu apa yang harus dimasukkan setelah pipa.
Awk adalah pilihan yang baik jika Anda harus berurusan dengan spasi kosong karena itu akan mengurusnya untuk Anda:
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
Cut tidak akan menangani ini:
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
'cut' di sini tidak mencetak apa pun / spasi, karena hal pertama sebelum spasi adalah spasi lain.
-F","
untuk mengganti pemisah bidang default (spasi) dengan koma.tidak perlu menggunakan perintah eksternal. Bash sendiri bisa melakukan pekerjaan itu. Dengan asumsi "kata1 kata2" Anda dapatkan dari suatu tempat dan disimpan dalam variabel, misalnya
sekarang Anda dapat menetapkan $ 1, atau $ 2 dll ke variabel lain jika Anda mau.
sumber
stdin
. @Matt M.--
artinyastdin
,$string
diteruskan sebagaistdin
.stdin
adalah spasi-dipisahkan menjadi argumen$1
,$2
,$3
, dll - seperti ketika Bash Program mengevaluasi argumen (misalnya cek$1
,$2
, dll), pendekatan ini mengambil keuntungan dari kecenderungan shell untuk membagistdin
ke dalam argumen otomatis, menghilangkan kebutuhan untukawk
ataucut
.set
menyetel argumen shell.word1=$(IFS=" " ; set -- $string ; echo $1)
Atur IFS untuk mengenali spasi di antara kata dengan benar. Bungkus dalam tanda kurung agar tidak mengganggu konten asli $ 1.string="*"
. Mengherankan.Saya pikir salah satu cara yang efisien adalah penggunaan bash array:
Selain itu, Anda bisa langsung membaca array dalam pipa-line:
sumber
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. Mengherankan.while
sintaks untuk mengambil setiap kata pertama di setiap baris. Jika tidak, gunakan pendekatan Rumah Boontawee. Juga, harap dicatat bahwaecho "${array[0]}"
telah dikutip untuk mencegah perluasan seperti yang diperhatikan oleh gniourf-gniourf.Ini memiliki keuntungan yaitu tidak menggunakan perintah eksternal dan membiarkan variabel $ 1, $ 2, dll tetap utuh.
sumber
$1, $2, …
utuh adalah fitur yang sangat berguna untuk penulisan skrip!Jika Anda yakin tidak ada spasi di depan, Anda dapat menggunakan substitusi parameter bash:
Hati-hati untuk keluar dari ruang tunggal. Lihat di sini untuk lebih banyak contoh pola substitusi. Jika Anda memiliki bash> 3.0, Anda juga dapat menggunakan pencocokan ekspresi reguler untuk mengatasi spasi di depan - lihat di sini :
sumber
Anda bisa mencoba awk
Dengan awk, sangat mudah untuk memilih kata apa pun yang Anda suka ($ 1, $ 2, ...)
sumber
Menggunakan ekspansi parameter shell
%% *
Berikut adalah solusi lain menggunakan ekspansi parameter shell . Ini menangani banyak spasi setelah kata pertama. Menangani spasi di depan kata pertama membutuhkan satu ekspansi tambahan.
Penjelasan
The
%%
menandakan menghapus pertandingan terpanjang kemungkinan*
(spasi diikuti oleh sejumlah apapun karakter lain) di membuntuti bagian daristring
.sumber
Saya bertanya-tanya bagaimana beberapa jawaban teratas diukur dalam kaitannya dengan kecepatan. Saya menguji yang berikut ini:
1 @ mattb
2 @ ghostdog74's
3 @ boontawee-home's
dan 4 @ boontawee-home
Saya mengukurnya dengan timeit Python dalam skrip Bash di terminal Zsh di macOS, menggunakan string uji dengan 215 kata 5 huruf. Lakukan setiap pengukuran lima kali (hasilnya semua untuk 100 loop, terbaik dari 3), dan ratakan hasilnya:
Kerja bagus, pemilih 👏 Suara (saat tulisan ini dibuat) cocok dengan kecepatan solusi!
sumber
read -a
tanda hubung tidak valid).cut memotong bidang pertama (-f 1) dari daftar bidang yang dipisahkan oleh string "" (-d "")
sumber
read
apakah temanmu:Jika string ada dalam variabel:
Jika Anda mengerjakan pipa: kasus pertama: Anda hanya menginginkan kata pertama dari baris pertama:
kasus kedua: Anda menginginkan kata pertama dari setiap baris:
Ini berfungsi jika ada spasi di depan:
sumber
Karena perl menggabungkan fungsionalitas awk, ini juga dapat diselesaikan dengan perl:
sumber
Saya bekerja dengan perangkat tertanam yang tidak memiliki perl, awk atau python dan melakukannya dengan sed. Ini mendukung banyak spasi sebelum kata pertama (yang tidak ditangani oleh solusi
cut
danbash
).Ini sangat berguna ketika
ps
mencari ID proses karena solusi lain di sini yang hanya menggunakan bash tidak dapat menghapus spasi pertama yangps
digunakan untuk menyelaraskan.sumber