Скрипт Bash: Вывести все строки между двумя шаблонами в переменных со слешами

Скрипт Bash: Вывести все строки между двумя шаблонами в переменных со слешами

У меня есть каталог, который выглядит так:

/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'

Связанный контент