Böyle bir dize var:
|abcdefg|
Ve |
başlangıçta ve sonunda iki karakter olmadan orijinal dize ile birlikte (dize2 gibi) çağrılan yeni bir dize elde etmek istiyorum.
abcdefg
Bash'ta bu mümkün mü?
Böyle bir dize var:
|abcdefg|
Ve |
başlangıçta ve sonunda iki karakter olmadan orijinal dize ile birlikte (dize2 gibi) çağrılan yeni bir dize elde etmek istiyorum.
abcdefg
Bash'ta bu mümkün mü?
Yanıtlar:
Yapabilirsin
string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2
Dize uzunluğunuz sabit ise veya
string="|abcdefg|"
string2=${string:1:7}
echo $string2
Ayrıca, bu çalışması gerekir
echo "|abcdefg|" | cut -d "|" -f 2
Ayrıca bu
echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
awk
çözümleriniz var. Ben öğrenmemiz gerekiyor awk
.
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
.
Burada listelenen birkaç gönderiden çıkmak, bunu yapmanın en basit yolu gibi görünüyor:
string="|abcdefg|"
echo ${string:1:-1}
düzenleme: bash 4.2 ile ubuntu üzerinde çalışır; bash 4.1 ile centOS üzerinde çalışmıyor
Başka bir yol da head
& tail
komutları kullanmaktır :
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]
Köşeli parantezleri kesme hedefim vardı , bu yüzden echo "[something something]" | tail -c +2 | head -c -2
işe yaradı. Bir ipucu için teşekkürler!
echo -n "|abcdefg|" | tail -c +2 | head -c -1
. Düzenlemelerimin neden reddedildiğinden emin değilim ... Dürüst olmak gerekirse çok üzücü. Daha man head
fazla bilgi için bakın
Ve bir tane daha:
string="|abcdefg|"
echo "${string//|/}"
Ayrıca kaldırmak için sed kullanabilirsiniz. sadece sembolün kendisine referans vermekle kalmaz, aynı zamanda konum referanslarını da kullanır:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
':' Sınırlayıcıların olduğu yerde (bunları sorguda olmayan veya herhangi bir karakterle değiştirebilirsiniz, s'yi izleyen herhangi bir işaret bunu yapacaktır) Burada ^ (caret) giriş dizesinin başlangıcında ve $ (dolar) anlamına gelir. sonunda. . (gelin) şapkaya ait ve dolar işaretinden önceki olan tek bir karakteri gösterir. Yani başka bir deyişle ilk ve son karakterleri siliyoruz. Unutmayın ki bu | dizede mevcut değil.
EX:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Biraz daha ayrıntılı bir yaklaşım, ancak herhangi bir ilk ve son karakter üzerinde çalışıyor, aynı olmak zorunda değil. Temel fikir, bir değişkeni alıp, karakter karakter okuyarak ve sadece yeni bir değişkene eklemek istediğimizdir.
İşte bütün fikir güzel bir işleve dönüştürülmüş
crop_string_ends() {
STR="$1"
NEWSTR=""
COUNT=0
while read -n 1 CHAR
do
COUNT=$(($COUNT+1))
if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ]
then
continue
fi
NEWSTR="$NEWSTR"$CHAR
done <<<"$STR"
echo $NEWSTR
}
Ve işte eylemde aynı işlev var:
$> crop_string_ends "|abcdefg|"
abcdefg
$> crop_string_ends "HelloWorld"
elloWorl
>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg
veya komut satırında:
$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"
abcdefg
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'
abcdefg
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"
abcdefg
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg
Http://tldp.org/LDP/abs/html/parameter-substitution.html adresinden
${var#Pattern}
Kaldır en kısa parçası uyan ön uç arasında . Kaldır en uzun parçası uyan arka uç arasında .$var
$Pattern
$var
${var%%Pattern}
$var
$Pattern
$var
awk -F\| '{ print $2 }' <<<"|string|"