Bash bir dizeden ilk ve son karakterleri kaldırır

Benim de böyle bir ipim var:

|abcdefg|

Ve başında ve sonunda iki | karakteri olmadan orijinal dizeyle bir şekilde (string2 gibi) çağrılan yeni bir dize almak istiyorum, böylece buna sahip olacağım:

abcdefg

Bu bash ile mümkün mü?

Çözüm

Yapabilirsin

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

Veya dize uzunluğunuz sabitse, şunu yapabilirsiniz

string="|abcdefg|"
string2=${string:1:7}
echo $string2

Ayrıca, bu işe yaramalı

echo "|abcdefg|" | cut -d "|" -f 2

Ayrıca bu

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
Yorumlar (5)

İşte dizenin uzunluğundan bağımsız bir çözüm (bash):

string="|abcdefg|"
echo "${string:1:${#string}-2}"
Yorumlar (0)

Ayrıca sed'i sadece sembolün kendisini referans alarak değil, konum referanslarını kullanarak da kaldırabilirsiniz:

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg

Burada ':' sınırlayıcılardır (bunları / veya sorguda olmayan herhangi bir karakterle değiştirebilirsiniz, s'yi takip eden herhangi bir işaret bunu yapacaktır) Burada ^ (şapka) giriş dizesinin başında ve $ (dolar) sonunda anlamına gelir. İşaretten sonra gelen . (nokta) ve dolar işaretinden önce gelen . (nokta) tek bir karakteri temsil eder. Yani başka bir deyişle ilk ve son karakterleri siliyoruz. Bunun, dizede bulunmasa bile herhangi bir karakteri sileceğini unutmayın.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Yorumlar (0)