Как вы анализируете имя файла в bash?
Вопрос
У меня есть имя файла в таком формате, как:
system-source-yyyymmdd.dat
Я хотел бы иметь возможность анализировать разные биты имени файла, используя "-" в качестве разделителя.
Решение
Вы можете использовать команда вырезать чтобы получить доступ к каждому из 3-х "полей", например:
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
"-d" задает разделитель, "-f" указывает номер требуемого поля
Другие советы
Приятный и элегантный (на мой взгляд:-) вариант использования только встроенных модулей - поместить его в массив
var='system-source-yyyymmdd.dat'
parts=(${var//-/ })
Затем вы можете найти нужные части в массиве...
echo ${parts[0]} ==> system
echo ${parts[1]} ==> source
echo ${parts[2]} ==> yyyymmdd.dat
Предостережение:это не сработает, если имя файла содержит "странные" символы, такие как пробел или, не дай бог, кавычки, обратные кавычки...
В зависимости от ваших потребностей, awk ( авк ) более гибкий, чем резаный.Первый тизер:
# echo "system-source-yyyymmdd.dat" \
|awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
$1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'
System: system
Source: source
Year: yyyy
Month: mm
Day: dd
Проблема в том, что описывать awk как "более гибкий", безусловно, все равно что называть iPhone усовершенствованным мобильным телефоном ;-)
Используйте cut
команда.
например ,
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
извлечет первый бит.
Измените значение параметра -f
параметр для получения соответствующих деталей.
Вот руководство по Вырезать команда.
Другой метод заключается в использовании внутренних инструментов синтаксического анализа командной строки, что позволяет избежать затрат на создание дочерних процессов:
oIFS=$IFS IFS=- file="system-source-yyyymmdd.dat" set $file IFS=$oIFS echo "Source is $2"
Самый простой (и, по-моему, лучший способ) сделать это - просто использовать read
:
$ IFS=-. read system source date ext << EOF
> foo-bar-yyyymmdd.dat
> EOF
$ echo $system
foo
$ echo $source $date $ext
bar yyyymmdd dat
Существует множество вариаций на эту тему, многие из которых зависят от оболочки:
bash$ IFS=-. read system source date ext <<< foo-bar-yyyymmdd.dat
echo "$name" | { IFS=-. read system source date ext
echo In all shells, the variables are set here...; }
echo but only in some shells do they retain their value here