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


98

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:


120

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/'

2
ve ayrıcaawk -F\| '{ print $2 }' <<<"|string|"
enzotib

1
@enzotib Her zaman harika awkçözümleriniz var. Ben öğrenmemiz gerekiyor awk.
Kris Harper,

3
ve ayrıca IFS='|' read string2 <<< $string:)
düzenlemek

10
ve ayrıca, bash 4.2 ve daha yeni sürümlerinde,"${string:1:-1}"
geirha

İçindeki "parametre genişletme" bölümünün altında okuyun man bash.
Nemo

62

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

string="|abcdefg|"
echo "${string:1:${#string}-2}"

29

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


19

Başka bir yol da head& tailkomutları kullanmaktır :

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg

1
[something something]Köşeli parantezleri kesme hedefim vardı , bu yüzden echo "[something something]" | tail -c +2 | head -c -2işe yaradı. Bir ipucu için teşekkürler!
Ain Tohvri

Açıkçası, olması gerektiği gibi 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 headfazla bilgi için bakın
Dmitry Khamitov


9

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

3

kabuk işlevi

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

piton

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

veya komut satırında:

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

Yakut

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg

2

Küçük ve evrensel çözüm:

expr "|abcdef|" : '.\(.*\).'

Bu durumda özel ve '|' karakter orada olabilir veya olmayabilir:

expr "|abcdef" : '|*\([^|]*\)|*'

2
$ 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

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.