Wie kann ich in sh / bash nach Index auf einen String verweisen? Das heißt, im Grunde es zu teilen.
Ich versuche, 5 Zeichen eines Dateinamens zu entfernen. Alle Namen haben die Struktur: name_nr_code. Ich versuche, das 5 alphanumerische Codebit zu entfernen. name_nr_
ist immer 10 Zeichen.
Gibt es so etwas?
for i in * ; do mv "$i" "$i"[:10] ; done
bash
Tag, wenn Sie nach einersh
Lösung fragen ?Antworten:
So einfach ist das.
(Bash)
Voila.
Und eine Erklärung aus dem Advanced Bash-Scripting Guide ( Kapitel 10. Manipulieren von Variablen ) (mit zusätzlichen NOTEs inline, um die Fehler in diesem Handbuch hervorzuheben):
NOTEfehlende Anführungszeichen um Parametererweiterungen!
echo
sollte nicht für beliebige Daten verwendet werden.NOTE:
expr substr
ist eine GNU-Erweiterung.NOTE: Das
echo
ist überflüssig und macht es noch weniger zuverlässig. Verwenden Sieexpr substr + "$string1" 1 2
.NOTE:
expr
wird mit einem Ausgangsstatus ungleich Null zurückgegeben, wenn der Ausgang 0 (oder -0, 00 ...) ist.Übrigens. Das Buch ist im offiziellen Ubuntu-Repository als vorhanden
abs-guide
.quelle
${var:1}
nicht der Wert vonvar
"1. Position", sondern der Wert von "2. Position" zurückgegeben wird.In POSIX
sh
,"${var%?????}"
wird$var
von den letzten 5 nachgestellten Zeichen befreit (oder$var
wenn$var
weniger als 5 Zeichen enthalten sind)"${var%"${var#??????????}"}"
sind die ersten 10 Zeichen von$var
."${var%_*}"
wird$var
von der kürzesten Zeichenfolge befreit, die_*
am Ende von$var
(foo_bar_baz
->foo_bar
) übereinstimmt ."${var%%_*}"
: Gleiche, aber längste Übereinstimmung anstelle der kürzesten Übereinstimmung (foo_bar_baz
->foo
).foo_bar_
:"${var%"${var##*_}"}"
(${var##pattern}
ist das selbe wie${var%%pattern}
aber suche das muster am anfang$var
statt am ende).Mit
zsh
:$var[1,-6]
für das erste Zeichen bis zum 6. vom Ende (also alle bis auf die letzten 5).$var[1,10]
für die ersten 10 Zeichen.Mit
ksh
,bash
oderzsh
:"${var:0:10}"
: die ersten 10 Zeichen von$var
Mit
bash
oderzsh
:"${var:0:-5}"
: alle bis auf die letzten 5 Zeichen (gibt einen Fehler aus und beendet das Skript, wenn$var
festgelegt, enthält aber weniger als 5 Zeichen, auch wenn$var
nicht mit festgelegtzsh
).Wenn Sie Bourne-
sh
Kompatibilität benötigen , ist es sehr schwierig, dies zuverlässig zu tun. Wenn Sie sicherstellen können, dass das Ergebnis nicht in Zeilenumbrüchen endet, können Sie Folgendes tun:Sie können auch die Länge von
$var
(je nach System unterschiedlich) begrenzen .Wenn in all diesen Lösungen
$var
Bytes enthalten sind, die nicht Teil gültiger Zeichen sind, wird YMMV verwendet.quelle
sh
bietet keine eingebaute Möglichkeit, einen Teilstring aus einem String zu holen (soweit ich sehen kann), aberbash
Sie können es tunDadurch erhalten Sie die ersten zehn Zeichen des Werts der Variablen
i
.Das allgemeine Format ist
${variable:offset:length}
.quelle
Die meisten Shells unterstützen eine Art Parametererweiterung, die Ihnen helfen kann. In Bash können Sie verwenden
In
dash
werden Offsets nicht unterstützt, Sie können jedoch führende und nachfolgende Muster verwenden:quelle
Verwenden Sie zunächst keine
for
Schleife für Dateinamen.Dann sollte so etwas helfen.
quelle
for
mit Dateinamen zu verwenden?printf
, um sicherer zu sein. ... undread -r
.for
Schleife war in Ordnung, bis auf die fehlenden--
. Ich kann mindestens 10 Bugs in Ihren 4 Codezeilen sehen! Viele der bekannten schlechten Praktiken wie die Annahme, dass Dateinamen einzeilig sind, verwenden Echo, fehlende Anführungszeichen