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

77

Bunun gibi bir dizim var:

|abcdefg|

Ve iki dizisi olmayan orijinal dizgiyle (string2 gibi) yeni bir dize almak istiyorum. başlangıçta ve sonunda

böylece buna sahip olacağım

abcdefg

bu bash'ta mümkün mü?

    
sordu Matteo Pagliazzi 23.12.2011 15:29

8 cevap

106

Yapabilirsin

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

Ya da dize uzunluğunuz sabitse, 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/^|\(.*\)|$//'
    
verilen cevap Kris Harper 23.12.2011 15:49
51

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

string="|abcdefg|"
echo "${string:1:${#string}-2}"
    
verilen cevap Samus_ 24.12.2011 17:28
18

Burada listelenen birkaç gönderiden çıkmak, bunu yapmanın en basit yolu:

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

düzenle: bash 4.2 ile ubuntu üzerinde çalışır; bash 4.1 ile centOS üzerinde çalışmaz

    
verilen cevap jlunavtgrad 05.09.2012 22:37
10

Ve başka bir tane:

string="|abcdefg|"
echo "${string//|/}"
    
verilen cevap Steven Penny 09.06.2012 03:03
8

Ayrıca kaldırmak için sed kullanabilirsin | sadece sembolün referansını değil, konumsal referansları kullanarak:

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

Burada ':' sınırlayıcılar (bunları sorgudaki / veya herhangi bir karakterle değiştirebilirsin, aşağıdaki işaretleri takip edecekler) Burada ^ (düzeltme işareti) giriş dizesinin başlangıcında ve $ ( dolar) sonunda demektir. . (nokta) ve sonra işaretinden önceki dolar işareti, tek bir karakteri temsil eder. Yani başka bir deyişle, ilk ve son karakterleri siliyoruz. Unutmayın ki bu, herhangi bir karakteri silse bile | dizede mevcut değil.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$::'
bcdef
    
verilen cevap Metafaniel 08.02.2012 02:44
8

Head & amp; Kuyruk:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg
    
verilen cevap Zavior 26.11.2013 17:16
2

kabuk işlevi

Biraz daha ayrıntılı yaklaşım, ancak herhangi bir türdeki ilk ve son karakter üzerinde çalışır, aynı olmak zorunda değildir. Temel fikir, bir değişken alıp, karakter karakterini okuyarak ve yalnızca yeni bir değişken istiyoruz

İşte bütün fikir güzel bir işleve biçimlendirildi

crop_string_ends() {
    STR="" 
    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 aynı işlev şu:

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

Python

>>> 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(
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg
,2,length(%pre%)-2)}' abcdefg

Yakut

%pre%     
verilen cevap Sergiy Kolodyazhnyy 06.04.2016 15:58
1

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

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

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

expr "|abcdef" : '|*\([^|]*\)|*'
    
verilen cevap Tosi Do 09.07.2017 01:29

Etiketlerdeki diğer soruları oku