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:]]*}
bash
shell-script
shell
regular-expression
Joshua Soileau
quelle
quelle
Antworten:
Weil Sie mehrere Leerzeichen verwenden möchten
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.Wenn Sie nur nach dem ersten Wort suchen , können Sie dies tun:
Dies kümmert sich um führende Leerzeichen, vorausgesetzt, Sie haben die IFS-Variable nicht geändert.
quelle
[: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.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:
Dies funktioniert auch dann, wenn die Leerzeichen Leerzeichen-Registerkarten NL oder CR sind.
Regex
Eine robustere Lösung ist möglicherweise die Verwendung eines regulären Ausdrucks:
quelle
Sie können auch das einfache Werkzeug verwenden
cut
, das Zeichenfolgen basierend auf einem Trennzeichen schneidet:Wo :
-d' '
Setzt das Trennzeichen auf ein Leerzeichen-f 1
gibt das erste Feld an (basierend auf dem Trennzeichen)quelle
Sie können die native Shell-String-Manipulation verwenden:
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).
quelle
Um nur Bash- und integrierte Befehle zu verwenden, können Sie IFS ( Internal Field Seperator ) und Arrays verwenden
quelle
*
.array=(*2492* *some * *string continues* here)
- funktioniert immer noch2492
den Namen enthältmyfile-2492.txt
, und führen Sie sie erneut aus.set -f
und enden mitset +f
?Wenn Ihnen ein externer Anruf nichts ausmacht, verwenden Sie awk oder sed:
quelle