Bash entfernt erste und letzte Zeichen aus einer Zeichenkette

Ich habe eine solche Schnur:

|abcdefg|

Und ich möchte eine neue Zeichenkette erhalten, die in irgendeiner Weise (wie string2) mit der ursprünglichen Zeichenkette ohne die beiden |-Zeichen am Anfang und am Ende der Zeichenkette aufgerufen wird, so dass ich Folgendes erhalte:

abcdefg

Ist das in der Bash möglich?

Lösung

Das können Sie tun

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

Oder, wenn die Länge der Zeichenkette konstant ist, können Sie

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

Außerdem sollte dies funktionieren

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

Auch dies

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

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

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

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

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

Wobei ':' die Begrenzungszeichen sind (Sie können sie durch / oder ein beliebiges Zeichen, das nicht in der Abfrage vorkommt, ersetzen, ein beliebiges Zeichen nach dem s tut es auch). Hier bedeutet ^ (Caret) den Anfang der Eingabezeichenfolge und $ (Dollar) das Ende. Der . (Punkt) nach dem Caret und der vor dem Dollarzeichen stehen für ein einzelnes Zeichen. Mit anderen Worten: Wir löschen das erste und das letzte Zeichen. Beachten Sie, dass dadurch alle Zeichen gelöscht werden, auch wenn sie nicht in der Zeichenkette vorhanden sind.

EX:

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