Предположим, у меня есть список CSV-файлов в следующем формате:
INT_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
ASG_B1_V1_<Product>_<ID>_<Name>_<ddmmyy>.csv
INT_V1_ & ASG_B1_V1_ фиксировано, то есть все файлы CSV начать с ним.
Как я могу разделить имена файлов на переменные?
Например, я хотел захватить Имя и присвоить его переменной $Name
.
Ответы:
С
zsh
:С
bash
4.3 или новее, ksh93t или новее или zsh в эмуляции sh (хотя вzsh
, вы бы скорее делалиfield=("${(@s:_:)field}")
для расщепления, чем с использованием бессмысленного оператора split + globsh
) вы могли бы разбить строку на_
символы и ссылаться на них с конца :Или (Bash 3.2 или новее):
(при этом предполагается, что
$file
в текущей локали содержится допустимый текст, который не гарантируется для имен файлов, если только вы не исправите локаль на C или другую локаль с однобайтовой кодировкой символов).Как
zsh
«S*
выше,.*
является жадным . Таким образом, первый будет съедать столько,*_
сколько возможно, а остальные.*
будут соответствовать только_
-безопасным строкам.С
ksh93
, вы могли бы сделатьВ POSIX
sh
сценарии, вы можете использовать${var#pattern}
,${var%pattern}
стандартные оператор расширения параметров:Или снова используйте оператор split + glob:
источник
ksh: file: 0403-046 The specified subscript cannot be greater than 4095.
на${field[-1]}
или что - либо в форме${x[n]}
.${field[-1]}
была дляbash-4.3+
. Дляksh
, используйте любое из решений "POSIX". Поддержка отрицательного индекса не была добавлена до ksh93t (функция, созданная в zsh).Вы можете взять значения вашего поля
<Name>
с этой командой:(или с
awk
):И вы можете поместить их в переменную, как это:
или
Не ясно в вопросе, хотите ли вы одну и ту же переменную для всех значений или одну переменную для каждого из них.
источник
источник
_
это не особенное и не нуждается в кавычках. Это предполагает, что имя файла не содержит символов новой строки. Вы можете добавить-d ''
.