
Ich habe ein Verzeichnis, das so aussieht:
/path/to/files/data-file.1
/path/to/files/data-file.2
/path/to/files/data-file.3
/path/to/files/data-file.4
/path/to/files/data-file.5
/path/to/files/data-file.6
Ich möchte ein Skript erstellen, um alle Dateien zwischen zwei Werten in Variablen wie den folgenden aufzulisten:
#!/bin/bash
fileA="/path/to/files/data-file.2"
fileB="/path/to/files/data-file.5"
ls -v /path/to/files/*-file.[0-9]* | sed -n '/$fileA/,/$fileB/p'
mit der Ausgabe:
/path/to/files/data-file.2
/path/to/files/data-file.3
/path/to/files/data-file.4
/path/to/files/data-file.5
Der sed-Befehl scheint jedoch nicht zu funktionieren. Ich vermute, es liegt an den Schrägstrichen in den Variablen. Gibt es eine Möglichkeit, dies zu umgehen, ohne die Variablen zu ändern? Ich möchte diesen Code in einem Skript verwenden, in dem DateiA und DateiB dynamisch sind.
Antwort1
Sie können ein anderes Trennzeichen verwenden, wenn Sie es beim ersten Vorkommen maskieren, sodass die Schrägstriche nicht verwirren sed
. Beachten Sie jedoch, dass die Verwendung von einfachen Anführungszeichen dazu führt bash
, dass Variablen nicht ersetzt werden. In Ihrem Beispiel wird also buchstäblich sed
nach $fileA
und gesucht $fileB
, da die Variablen nicht erweitert werden. Sie müssen doppelte Anführungszeichen verwenden, wenn Sie Variablen verwenden.
Also, so etwas sollte funktionieren:
#!/bin/bash
fileA="/path/to/files/data-file.2"
fileB="/path/to/files/data-file.5"
ls -v /path/to/files/*-file.[0-9]* | sed -n "\@$fileA@,\@$fileB@p'