2016-09-21 40 views
8

İçinde çok satırlı (metin) bir değişkenim varsa, son satırı nasıl alabilirim?Bash bir satırdaki son satırı al

STRING="This is a 
multiple line 
variable test" 
FIRST_LINE=(${STRING[@]}) 
echo "$FIRST_LINE" 

# output: 
"This is a" 

Muhtemelen son satır için bir operatör olmalıdır:

Zaten ilk hat almak için yolunu bulmuştur. Ya da en azından sanırım, @ ile ilk satır çıkar. Böylece sadece bırakarak dize baştan \n kadar en uzun maçı kaldıracak

$> str="This is a 
multiple line 
variable test" 

$> echo "${str##*$'\n'}" 
variable test 

${str##*$'\n'}: bash dize manipülasyonlar kullanılması

echo "$STRING" | tail -n1 
+2

Komut dizininiz, yalnızca tüm satır değil, değişkenin (Bu) ilk kelimesidir. –

+0

Oh, anlamadım. Belki de benim kullanım durumunda ilk satırın sadece tek bir kelime olduğu için. * phew * –

+0

Bu tür manipülasyonlar yapmanız gerekiyorsa, satırları bir dizide değil, bir dizide saklayın! –

cevap

10

:

+2

Yine on saniye içinde dövüldü! – Inian

+1

Vay. Sanırım @ redneb'in cevabı bana daha kolay ya da daha zarif görünüyor, ama bu işe yarıyor ve muhtemelen "doğru" yoldur. Teşekkürler –

+1

@MattBackslash: Daha taşınabilir bir yol arıyorsanız, bu, tüm kabuk türlerinde çalışabilme olasılığı olan doğru seçimdir – Inian

11

Bunu yapmanın kolay bir yolu tail kullanmaktır girişteki son satır. Eğer STRING gelen satıra bir eleman içeren bir dizi istiyorsanız

1

,

readarray -t lines <<< "$STRING" 

Ardından, ilk satır ${lines[0]} olacağını kullanın ve son satır ${lines[-1]} olurdu. bash'un eski sürümlerinde, negatif endekslere izin verilmez ve son dizini el ile hesaplamanız gerekir: ${lines[${#lines[@]}-1]}.

+1

Küçük bir not 'bash 4.x' ihtiyaç duyuyor olabilir? – Inian

+0

IMO, 3.x sadece "dash" ile eşit olarak POSIX uyumlu bir kabuk olarak ele alınmalıdır, ancak etkileşimli kullanım için daha iyi özelliklere sahip olmalıdır. Yaklaşık 6 yaşındaki 'bash' 4.2 sürümünün şu an makul bir temel varsayım olduğunu düşünüyorum. – chepner

+0

Halen desteklenmediği GNU bash, 4.1.2 sürümü btw :). :(Doğru bir referans eklemek için iyi bir nokta olurdu. – Inian