Saya memiliki string yang "rtcpOnNbActive true"
disimpan dalam variabel x
. Saya ingin mengekstrak "true" sebagai substring dan menyimpan dalam variabel. Bagaimana saya bisa melakukan ini?
Saya memiliki string yang "rtcpOnNbActive true"
disimpan dalam variabel x
. Saya ingin mengekstrak "true" sebagai substring dan menyimpan dalam variabel. Bagaimana saya bisa melakukan ini?
Jawaban:
Coba dengan cara ini:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
menampilkan nilai x
.awk '{print $2}'
mencetak bidang kedua dari tampilan sebelumnya x
.$(
... )
tahan output dan biarkan tetapkan ke y
.echo $x
adalah tidak menampilkan nilaix
. printf '%s\n' "$x"
akan menjadi.
awk '{print $2}'
mencetak bidang kedua dari setiap baris yang sebelumnya ditampilkan x
.
Dengan asumsi bahwa setidaknya ada satu ruang sebelum substring yang ingin Anda ekstrak (dan bahwa substring tidak mengandung spasi), Anda dapat melakukan ini dengan perluasan parameter sederhana:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
keluaran
[true]
echo
tidak portabel untuk apa pun selain string literal yang tidak dimulai -
dan tidak mengandung urutan pelarian. Perilakunya bervariasi bahkan untuk bash bawaan, tergantung pada bagaimana itu dikompilasi, dan apakah XPG_ECHO
diatur. Dengan asumsi string tidak mengandung urutan escape, ini harus baik-baik saja, tetapi printf '[%s]\n' "$y"
masih lebih baik.
echo
untuk menampilkan nilai variabel, bahkan dalam contoh "membuang" seperti ini.
Anda dapat menggunakan awk:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
jumlah bidang dalam catatan saat ini
menggunakan sed:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
menggunakan ekspresi string:
a="rtcpOnNbActive true"
echo ${a##* }
true
menggunakan grep:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o hanya memberikan kecocokan persis, [a-z]+
akan mencocokkan huruf dari az dan $
berarti di akhir
echo
tidak portabel untuk apa pun selain string literal yang tidak dimulai -
dan tidak mengandung urutan pelarian. Perilakunya bervariasi bahkan untuk bash bawaan, tergantung pada bagaimana itu dikompilasi, dan apakah XPG_ECHO
diatur. Selain itu, Anda harus selalu menggandakan ekspansi variabel penawaran dan penggantian perintah (dengan pengecualian tertentu, di mana itu tidak perlu tetapi juga tidak membahayakan). Dengan string seperti OP, ini harus baik-baik saja, tetapi jika Anda ingin memastikan printf '%s\n' "${a##* }"
akan lebih baik.
Anda bisa menggunakan read
built-in
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Bukan itu read
yang membagi - itu $IFS
. Untuk beberapa alasan, banyak orang menganggap itu baik-baik saja untuk membagi dengan $IFS
hanya ketika read
terlibat. Anda bisa melakukan: set -f; IFS=' '; printf %.0s%s $x
atau apa pun. Bagaimanapun - Anda perlu menentukan $IFS
nilai di sini.
read
melakukan pemisahan menggunakan IFS
, periksa dokumentasinya . Keuntungan utama menggunakan read adalah bahwa ia menetapkan variabel (yang merupakan persyaratan OP) dan mengingat bahwa ia dapat memecah string dan mengisi array, baik untuk mengekstraksi bidang acak dari string. Selain itu, saya mengasumsikan default di IFS
sini, tetapi cukup mudah untuk mengatur jika diperlukan, IFS=$' \n\t' read -r _ y <<<"$x"
akan melakukan trik
read
menugaskan, $IFS
membagi. jika Anda ingin mengisi array, gunakan set
- Anda tidak perlu omong kosong di sini-string buatan dalam kasus itu. unset IFS
mendapat perilaku default $ IFS.
x
sebelum substring yang ingin Anda ekstrak?