Bir dize değişkenindeki N. kelime


87

Bash'de, bir değişken tarafından tutulan dizenin N. kelimesini almak istiyorum.

Örneğin:

STRING="one two three four"
N=3

Sonuç:

"three"

Bunu hangi Bash komutu / betiği yapabilir?

Yanıtlar:


99
echo $STRING | cut -d " " -f $N

3
mevcut olmayan bir alan talep edildiğinde kesme işlemi başarısız olur. "" Döndürmek yerine dizenin kendisini döndürür. Örnek: echo "aaaa" | cut -f2 sonucu "aaaa", boş sıfır uzunluk sonucu değil.
ajaaskel

@ajaaskel Bu , girişte sınırlayıcı bulunmadığında ortaya çıkıyor. Ve bu davranış günümüzde sadece sınırlandırılmış seçeneği kullanılarak değiştirilebilir.
Samuli Pahaoja

64

Bir alternatif

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
Bunun için bash dizilerini kullanmak "en iyi" çözüm, awk veya sed kullanmaktan nefret ediyorum, çünkü bunların tüm kurulumlarda, özellikle de msys kurulumunda yüklü olduğunu görmüyorum.
Sundar

1
Echo "gerekli" olmasa da, arr elemanlarının nasıl kullanılacağını anlamak için yararlı buldum. Teşekkürler
Chen Li Yong

1
Eğer IFS(dahili alan ayırıcı) ':' veya beyaz boşluk yerine başka bir şeye ayarladıysanız , bunu denemeden önce tekrar değiştirin.
Noumenon

1
Bu doğru cevap olmalı. Bu amaçla dizileri kullanmak hem basit hem de zekice.
ajaaskel

32

Kullanma awk

echo $STRING | awk -v N=$N '{print $N}'

Ölçek

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

Bazı ifadeler içeren bir dosya:

cat test.txt

Sonuç:

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

Dolayısıyla, bu ifadenin 4. kelimesini yazdırmak için:

cat test.txt |awk '{print $4}'

Çıktı :

1st
2nd
3rd
4th
5th

2
OP, dizenin bir dosyada değil, bir değişkende olduğunu söyler.
codeforester

3

Pahalı çatal yok, boru yok, eziyet yok:

$ set -- $STRING
$ eval echo \${$N}
three

Ama hobilere dikkat edin.


2
STRING=(one two three four)
echo "${STRING[n]}"

2
Örneğinizde, STRING gerçekten bir dizge mi? Bir diziye benziyor.
Nicolas Raoul

@NicolasRaoul Evet aslında haklısın. Ama alternatif olarak yazdım.
mnrl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.