
У меня есть каталог, который выглядит так:
/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
Я хотел бы создать скрипт для вывода списка всех файлов между двумя значениями в переменных, например следующим образом:
#!/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'
с выходом:
/path/to/files/data-file.2
/path/to/files/data-file.3
/path/to/files/data-file.4
/path/to/files/data-file.5
Однако команда sed, похоже, не работает. Я предполагаю, что это из-за слешей в переменных. Есть ли способ обойти это, не меняя переменные? Я хотел бы использовать этот кусок кода в скрипте, где fileA и fileB являются динамическими.
решение1
Вы можете использовать другой разделитель, если вы экранируете его при первом появлении, так что косые черты не будут путать sed
. Однако обратите внимание, что использование одинарных кавычек приведет к тому, что bash
переменные не будут заменяться, поэтому в вашем примере sed
ищется $fileA
и $fileB
буквально, так как переменные не раскрываются. Вам нужно использовать двойные кавычки, если вы используете переменные.
Итак, должно сработать что-то вроде этого:
#!/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'