it-swarm.com.de

Wie entferne ich die letzten n Zeichen aus einer Zeichenkette in Bash?

Ich habe eine Variable var in einem Bash-Skript, die eine Zeichenfolge enthält, wie:

echo $var
"some string.rtf"

Ich möchte die letzten 4 Zeichen dieser Zeichenkette entfernen und das Ergebnis einer neuen Variablen var2 zuweisen, damit

echo $var2
"some string"

Wie kann ich das machen?

148
becko

Das können Sie machen:

#!/bin/bash

v="some string.rtf"

v2=${v::-4}

echo "$v --> $v2"
173
phe

Um vier Zeichen vom Ende der Zeichenfolge zu entfernen, verwenden Sie ${var%????}.

Um alles nach dem letzten . zu entfernen, verwenden Sie ${var%.*}.

129
Etan Reisner

Verwenden von Variable Expansion/Substring-Austausch :

$ {var /% Pattern/Replacement}

Wenn das Suffix var mit Pattern übereinstimmt, ersetzen Sie Pattern durch Replacement.

Sie können also Folgendes tun:

~$ echo ${var/%????/}
some string

Alternative,

Wenn Sie immer die gleichen 4 Buchstaben haben

~$ echo ${var/.rtf/}
some string

Wenn es immer auf .xyz endet:

~$ echo ${var%.*}
some string

Sie können auch die Länge der Zeichenfolge verwenden:

~$ len=${#var}
~$ echo ${var::len-4}
some string

oder einfach echo ${var::-4}

34
fredtantini

Was bei mir funktioniert hat war:

echo "hello world" | rev | cut -c5- | rev
# hello w

Aber ich habe es benutzt, um Zeilen in einer Datei zu schneiden, deshalb sieht es unangenehm aus. Die eigentliche Verwendung war:

cat somefile | rev | cut -c5- | rev

cut bringt Sie nur so weit wie möglich von einer Startposition weg, was schlecht ist, wenn Sie Zeilen mit variabler Länge benötigen. Diese Lösung kehrt also ( rev ) den String um und bezieht sich nun auf seine Endposition. Dann verwendet sie cut wie erwähnt und kehrt (wiederum rev um =) es zurück zu seiner ursprünglichen Bestellung.

28
Reut Sharabani

Sie könnten sed verwenden,

sed 's/.\{4\}$//' <<< "$var"

Beispiel:

$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<< "$var")
$ echo $var1
some string
23
Avinash Raj

Ich habe Folgendes versucht und es hat bei mir funktioniert:

#! /bin/bash

var="hello.c"
length=${#var}
endindex=$(expr $length - 4)
echo ${var:0:$endindex}

Ausgabe: hel

2
Priya Jain

Hoffe, das folgende Beispiel wird helfen,

echo ${name:0:$((${#name}-10))}->${name:start:len}

  • Im obigen Befehl ist name die Variable.
  • start ist der String-Startpunkt
  • len ist die Länge der Zeichenkette, die entfernt werden muss.

Beispiel:

    read -p "Enter:" name
    echo ${name:0:$((${#name}-10))}

Ausgabe:

    Enter:Siddharth Murugan
    Siddhar

Hinweis: In Bash 4.2 wurde die Unterstützung für negative Teilzeichenfolgen hinzugefügt

0

Dies funktionierte für mich durch die Berechnung der Größe der Zeichenfolge.
Es ist einfach, den Wert, den Sie zurückgeben möchten, zu wiederholen und dann wie unten beschrieben zu speichern

removechars(){
        var="some string.rtf"
        size=${#var}
        echo ${var:0:size-4}  
    }
    removechars
    var2=$?

eine Saite

0
Saurabh