файл - bash цикл в одну строку




Как вы разбираете имя файла в bash? (4)

У меня есть имя файла в формате:

system-source-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 для получения каждого из 3 'полей', например:

$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source

«-d» указывает разделитель, «-f» указывает номер требуемого поля


Используйте команду cut .

например

echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'

будет извлекать первый бит.

Измените значение параметра -f чтобы получить соответствующие части.

Вот руководство по команде Cut .


Самый простой (и лучший способ ИМО) сделать это просто:

$ 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






cut