it-swarm.com.de

Bash entfernen Sie das erste und letzte Zeichen aus einer Zeichenfolge

Ich habe so eine Zeichenfolge:

|abcdefg|

Und ich möchte einen neuen String (wie string2) mit dem Original-String ohne die beiden Zeichen | am Anfang und am Ende bekommen, damit ich Folgendes bekomme:

abcdefg

Ist das in bash möglich?

96

Du kannst tun

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

Oder wenn Ihre String-Länge konstant ist, können Sie dies tun

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

Auch das sollte funktionieren

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

Auch diese

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
120
Kris Harper

Hier ist eine Lösung, die unabhängig von der Länge der Zeichenfolge (Bash) ist:

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

Nach ein paar hier aufgelisteten Posts scheint es der einfachste Weg zu sein, dies zu tun:

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

edit: arbeitet auf Ubuntu mit Bash 4.2; funktioniert nicht unter centOS mit bash 4.1

28
jlunavtgrad

Eine andere Möglichkeit ist die Verwendung der Befehle head & tail:

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

Und noch einer:

string="|abcdefg|"
echo "${string//|/}"
10
Steven Penny

Sie können auch sed verwenden, um | zu entfernen nicht nur das Symbol selbst referenzieren, sondern Positionsreferenzen wie in:

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

Wobei ':' die Begrenzer sind (Sie können sie durch/oder ein beliebiges Zeichen ersetzen, das nicht in der Abfrage enthalten ist. Alle Zeichen, die auf das s folgen, tun dies.) Hier bedeutet ^ (Caret) am Anfang der Eingabezeichenfolge und $ (Dollar) bedeutet Am Ende. Das . (Punkt), dass es nach dem Caret steht und dass es vor dem Dollarzeichen ein einzelnes Zeichen darstellt. Mit anderen Worten, wir löschen das erste und das letzte Zeichen. Beachten Sie, dass dadurch alle Zeichen gelöscht werden, auch wenn | Es ist nicht in der Zeichenfolge vorhanden.

EX:

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

Shell-Funktion

Ein etwas ausführlicherer Ansatz, der jedoch mit allen Arten von ersten und letzten Zeichen funktioniert, muss nicht identisch sein. Die Grundidee ist, dass wir eine Variable nehmen, Zeichen für Zeichen lesen und nur diejenigen anhängen, die wir einer neuen Variablen hinzufügen möchten

Hier ist die ganze Idee in eine Nice-Funktion formatiert

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 
}

Und hier ist die gleiche Funktion in Aktion:

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

Python

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

oder auf der Kommandozeile:

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

AWK

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

Ruby

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

Kleine und universelle Lösung:

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

Besonderes in diesem Fall und damit das '|' Zeichen kann da sein oder nicht:

expr "|abcdef" : '|*\([^|]*\)|*'
2
Tosi Do
_$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg
_

From http://tldp.org/LDP/abs/html/parameter-substitution.html

${var#Pattern}
Entfernen Sie aus _$var_ den kürzesten Teil von _$Pattern_, der mit dem Frontend übereinstimmt. von _$var_.
${var%%Pattern}
Entfernen Sie aus _$var_ den längsten Teil von _$Pattern_, der mit dem Backend übereinstimmt. von _$var_.

1
Brian