2492 some string continues here
Ich möchte dies in konvertieren
2492
in Bash. Wie würde ich das machen?
Das fühlt sich eng an, funktioniert aber nicht:
var="2492 some string continues here "
echo ${var%[[:space:]]*}
2492 some string continues here
Ich möchte dies in konvertieren
2492
in Bash. Wie würde ich das machen?
Das fühlt sich eng an, funktioniert aber nicht:
var="2492 some string continues here "
echo ${var%[[:space:]]*}
Antworten:
Weil Sie mehrere Leerzeichen verwenden möchten
${var%%[[:space:]]*}
# ...^^
um den längsten nachfolgenden Teilstring zu entfernen , der mit einem Leerzeichen beginnt
Mit nur einem %
Zeichen entfernen Sie die kürzeste Folge eines Leerzeichens, gefolgt von null oder mehr Zeichen. Dies ist nur das letzte Leerzeichen in der Zeichenfolge.
$ echo ">$var<"; echo ">${var%[[:space:]]*}<"; echo ">${var%%[[:space:]]*}<"
>2492 some string continues here <
>2492 some string continues here <
>2492<
Wenn Sie nur nach dem ersten Wort suchen , können Sie dies tun:
read -r word rest_of_string <<<"$var"
echo "I have: $word"
Dies kümmert sich um führende Leerzeichen, vorausgesetzt, Sie haben die IFS-Variable nicht geändert.
[:space:]
Die Zeichenklasse umfasst Leerzeichen, Tabulatoren, CR, NL usw. Es ist also ein Allheilmittel für jedes Leerzeichen.
a=($var); echo "${a[0]}"
funktioniert auch für den Zugriff auf das erste Wort bei führenden Leerzeichen.
set -f
Es gibt die einfache Lösung, %%
( ${var%% *}
) anstelle von %
( ${var% *}
) zu verwenden. Dadurch wird *
nach einem anfänglichen Leerzeichen alles ( ) entfernt.
$ var='2492 some string continues here'
$ echo "${var%% *}"
2492
Dies schlägt jedoch fehl, wenn die Zeichenfolge in var führende Leerzeichen enthält. Es ist möglich, die führenden Leerzeichen zu entfernen mit:
$ var=$' \t 2492 some string continues here '
$ var="${var#"${var%%[![:space:]]*}"}"
$ echo "$var"
2492 some string continues here
$ echo "${var%%[[:space:]]*}"
2492
Dies funktioniert auch dann, wenn die Leerzeichen Leerzeichen-Registerkarten NL oder CR sind.
Eine robustere Lösung ist möglicherweise die Verwendung eines regulären Ausdrucks:
$ var=$' \t 2492 some string continues here '
$ regex='^[[:space:]]*([^[:space:]]+)'
$ [[ $var =~ $regex ]] && var=${BASH_REMATCH[1]}
$ echo "$var"
2492
Sie können auch das einfache Werkzeug verwenden cut
, das Zeichenfolgen basierend auf einem Trennzeichen schneidet:
echo "$mystring" | cut -d' ' -f 1
Wo :
-d' '
Setzt das Trennzeichen auf ein Leerzeichen-f 1
gibt das erste Feld an (basierend auf dem Trennzeichen)Sie können die native Shell-String-Manipulation verwenden:
TEST="test 1234 foo"
SPLIT_VAR=${TEST/ */ }
Es ersetzt das erste Muster, das mit "*" übereinstimmt (ein Leerzeichen, dann irgendetwas), und ersetzt es durch "" (ein Leerzeichen). Sie behalten also das erste Wort und das erste Leerzeichen.
Weitere Informationen zur Verwendung der Zeichenfolgenmanipulation finden Sie unter http://www.tldp.org/LDP/abs/html/string-manipulation.html .
Und als Randnotiz, es funktioniert auch weniger entwickelte Shell (getestet auf der Ash-Implementierung von Busybox).
Um nur Bash- und integrierte Befehle zu verwenden, können Sie IFS ( Internal Field Seperator ) und Arrays verwenden
set -f # To prevent filename globbing when creating the array, as pointed out by Kusalananda in the comments
array=(2492 some string continues here)
set +f # enable it again
IFS=" "
echo "${array[0]}"
unset IFS
*
.
array=(*2492* *some * *string continues* here)
- funktioniert immer noch
2492
den Namen enthält myfile-2492.txt
, und führen Sie sie erneut aus.
set -f
und enden mit set +f
?
Wenn Ihnen ein externer Anruf nichts ausmacht, verwenden Sie awk oder sed:
$ string="first second third fourth"
$ echo "${string}" | awk '{print $1}' # will work even with tabs
first
$ echo "${string}" | sed -e "s/ .*$//" # will fail on leading whitespace
first