1379 Stimmen

Wie schneidet man Leerzeichen aus einer Bash-Variablen?

Ich habe ein Shell-Skript mit diesem Code:

var=`hg st -R "$path"`
if [ -n "$var" ]; then
    echo $var
fi

Aber der bedingte Code wird immer ausgeführt, weil hg st gibt immer mindestens ein Zeilenumbruchzeichen aus.

  • Gibt es eine einfache Möglichkeit, Leerzeichen aus $var (wie trim() en PHP ) ?

o

  • Gibt es eine Standardmethode, um mit diesem Problem umzugehen?

Ich könnte Folgendes gebrauchen sed o AWK aber ich denke, dass es eine elegantere Lösung für dieses Problem gibt.

1620voto

makevoid Punkte 3186

Eine einfache Antwort ist:

echo "   lol  " | xargs

Xargs wird das Trimmen für Sie übernehmen. Ein einziger Befehl/Programm, keine Parameter, gibt die getrimmte Zeichenfolge zurück, so einfach ist das!

Hinweis: Dadurch werden nicht alle internen Leerzeichen entfernt. "foo bar" gleich bleibt; sie wird NICHT "foobar" . Mehrere Leerzeichen werden jedoch zu einzelnen Leerzeichen verdichtet, so dass "foo bar" werden "foo bar" . Außerdem werden keine Zeichen am Zeilenende entfernt.

1218voto

MattyV Punkte 835

Definieren wir eine Variable, die führende, abschließende und dazwischenliegende Leerzeichen enthält:

FOO=' test test test '
echo -e "FOO='${FOO}'"
# > FOO=' test test test '
echo -e "length(FOO)==${#FOO}"
# > length(FOO)==16

Wie entfernt man alle Leerzeichen (gekennzeichnet durch [:space:] en tr ) :

FOO=' test test test '
FOO_NO_WHITESPACE="$(echo -e "${FOO}" | tr -d '[:space:]')"
echo -e "FOO_NO_WHITESPACE='${FOO_NO_WHITESPACE}'"
# > FOO_NO_WHITESPACE='testtesttest'
echo -e "length(FOO_NO_WHITESPACE)==${#FOO_NO_WHITESPACE}"
# > length(FOO_NO_WHITESPACE)==12

Wie man nur führende Leerzeichen entfernt:

FOO=' test test test '
FOO_NO_LEAD_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//')"
echo -e "FOO_NO_LEAD_SPACE='${FOO_NO_LEAD_SPACE}'"
# > FOO_NO_LEAD_SPACE='test test test '
echo -e "length(FOO_NO_LEAD_SPACE)==${#FOO_NO_LEAD_SPACE}"
# > length(FOO_NO_LEAD_SPACE)==15

Wie entfernt man nur die Leerzeichen am Ende:

FOO=' test test test '
FOO_NO_TRAIL_SPACE="$(echo -e "${FOO}" | sed -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_TRAIL_SPACE='${FOO_NO_TRAIL_SPACE}'"
# > FOO_NO_TRAIL_SPACE=' test test test'
echo -e "length(FOO_NO_TRAIL_SPACE)==${#FOO_NO_TRAIL_SPACE}"
# > length(FOO_NO_TRAIL_SPACE)==15

Wie man sowohl führende als auch nachgestellte Leerzeichen entfernt - Verkettung der sed s:

FOO=' test test test '
FOO_NO_EXTERNAL_SPACE="$(echo -e "${FOO}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
echo -e "FOO_NO_EXTERNAL_SPACE='${FOO_NO_EXTERNAL_SPACE}'"
# > FOO_NO_EXTERNAL_SPACE='test test test'
echo -e "length(FOO_NO_EXTERNAL_SPACE)==${#FOO_NO_EXTERNAL_SPACE}"
# > length(FOO_NO_EXTERNAL_SPACE)==14

Wenn Ihre Bash dies unterstützt, können Sie alternativ auch echo -e "${FOO}" | sed ... con sed ... <<<${FOO} so (für Leerzeichen am Ende):

FOO_NO_TRAIL_SPACE="$(sed -e 's/[[:space:]]*$//' <<<${FOO})"

540voto

bashfu Punkte 249

Es gibt eine Lösung, die nur Bash-Built-Ins verwendet, die Wildcards :

var="    abc    "
# remove leading whitespace characters
var="${var#"${var%%[![:space:]]*}"}"
# remove trailing whitespace characters
var="${var%"${var##*[![:space:]]}"}"   
printf '%s' "===$var==="

Hier ist das Gleiche in eine Funktion verpackt:

trim() {
    local var="$*"
    # remove leading whitespace characters
    var="${var#"${var%%[![:space:]]*}"}"
    # remove trailing whitespace characters
    var="${var%"${var##*[![:space:]]}"}"   
    printf '%s' "$var"
}

Sie übergeben die zu trimmende Zeichenkette in Anführungszeichen. z.B.:

trim "   abc   "

Das Schöne an dieser Lösung ist, dass sie mit jeder POSIX-kompatiblen Shell funktioniert.

Referenz

130voto

rkachach Punkte 15236

Um alle Leerzeichen am Anfang und am Ende einer Zeichenkette zu entfernen (einschließlich der Zeichen am Zeilenende):

echo $variable | xargs echo -n

Dadurch werden auch doppelte Leerzeichen entfernt:

echo "  this string has a lot       of spaces " | xargs echo -n

Produces: 'this string has a lot of spaces'

112voto

Die Bash hat eine Funktion namens Parametererweiterung die unter anderem die Ersetzung von Zeichenketten auf der Grundlage der so genannten Muster (Muster ähneln regulären Ausdrücken, aber es gibt grundlegende Unterschiede und Einschränkungen). [flussence's original line: Bash hat reguläre Ausdrücke, aber sie sind gut versteckt:]

Im Folgenden wird gezeigt, wie Sie alle Leerraum (auch von innen) aus einem Variablenwert.

$ var='abc def'
$ echo "$var"
abc def
# Note: flussence's original expression was "${var/ /}", which only replaced the *first* space char., wherever it appeared.
$ echo -n "${var//[[:space:]]/}"
abcdef

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X