"rtcpOnNbActive true"
Bir değişkende saklanan bir dize var x
. Bir alt dize olarak "true" ayıklamak ve bir değişken depolamak istiyorum. Bunu nasıl yapabilirim?
"rtcpOnNbActive true"
Bir değişkende saklanan bir dize var x
. Bir alt dize olarak "true" ayıklamak ve bir değişken depolamak istiyorum. Bunu nasıl yapabilirim?
Yanıtlar:
Bu şekilde deneyin:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
değerini göster x
.awk '{print $2}'
önceden görüntülenen ikinci alanı yazdırır x
.$(
... )
çıktıyı tutun ve atamasına izin verin y
.echo $x
olduğu değil değerini göstermekx
. printf '%s\n' "$x"
olabilir.
awk '{print $2}'
önceden görüntülenen her satırın ikinci alanını yazdırır x
.
Ayıklamak istediğiniz alt dizeden önce en az bir boşluk olduğunu (ve alt dizenin boşluk içermediğini) varsayarsak, bunu basit bir parametre genişletmesiyle yapabilirsiniz:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
çıktı
[true]
echo
başlamamış -
ve herhangi bir kaçış dizisi içermeyen değişmez bir dize dışında hiçbir şey için taşınabilir değildir. Davranışı, nasıl derlendiğine ve XPG_ECHO
ayarlanıp ayarlanmadığına bağlı olarak bash yerleşkesi için bile değişir . Dizenin kaçış dizisi içermediğini varsayarsak, bu iyi olmalı, ancak printf '[%s]\n' "$y"
yine de daha iyidir.
echo
, bunun gibi "fırlatma" örneklerinde bile, değişkenlerin değerini göstermek için kullanma alışkanlığımı kırmalıyım .
awk kullanabilirsiniz:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
geçerli kayıttaki alan sayısı
sed kullanarak:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
dize ifadesi kullanarak:
a="rtcpOnNbActive true"
echo ${a##* }
true
grep kullanarak:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o sadece tam eşleşmeyi verir [a-z]+
, az harfiyle eşleşir ve $
sonunda anlamına gelir
echo
başlamamış -
ve herhangi bir kaçış dizisi içermeyen değişmez bir dize dışında hiçbir şey için taşınabilir değildir. Davranışı, nasıl derlendiğine ve XPG_ECHO
ayarlanıp ayarlanmadığına bağlı olarak bash yerleşkesi için bile değişir . Ayrıca, değişken genişletmeleri ve komut ikamesini her zaman iki kez vermelisiniz (bazı istisnalar dışında, gerekli olmadığı, ancak herhangi bir zarar vermediği). OP gibi bir dize ile, bu iyi olmalı, ancak emin olmak printf '%s\n' "${a##* }"
istiyorsanız daha iyi olurdu.
Sen kullanabilirsiniz read
yerleşik
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read
? Bu read
bölünmeyi yapmaz - değil $IFS
. Bazı nedenlerden dolayı, birçok kişi w / $IFS
sadeceread
dahil olduğunda bölmek için Tamam düşünün . Sadece yapabilirsin: set -f; IFS=' '; printf %.0s%s $x
ya da her neyse. Her durumda - $IFS
değerini burada belirtmeniz gerekir .
read
kullanarak bölme yapıyor IFS
, belgeleri kontrol edin . Read kullanmanın temel avantajı, değişkenleri (bir OP gereksinimi) ayarlaması ve dizeleri bölebileceği ve bir diziyi doldurabildiği göz önüne alındığında, bir dizeden rastgele alanları ayıklamak için iyi olmasıdır. Buna ek olarak, IFS
burada varsayılan kabul ediyorum , ancak gerekirse ayarlamak için yeterince kolay IFS=$' \n\t' read -r _ y <<<"$x"
, hile yapacak
read
atar, $IFS
böler. bir dizi doldurmak istiyorsanız, kullanın set
- bu durumda yapay burada-string saçmalık gerekmez. unset IFS
varsayılan $ IFS davranışını alır.
x
Ayıklamak istediğiniz alt dizeden hemen önce her zaman bir boşluk olacak mı?