Как вы анализируете имя файла в bash? - PullRequest
25 голосов
/ 08 сентября 2008

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

system-source-yyyymmdd.dat

Я бы хотел иметь возможность анализировать различные биты имени файла, используя "-" в качестве разделителя.

Ответы [ 6 ]

29 голосов
/ 08 сентября 2008

Вы можете использовать команду cut , чтобы получить доступ к каждому из 3 'полей', например ::

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

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

9 голосов
/ 27 января 2009

Хороший и элегантный (на мой взгляд :-) использование только встроенных модулей - это поместить его в массив

var='system-source-yyyymmdd.dat'
parts=(${var//-/ })

Затем вы можете найти части в массиве ...

echo ${parts[0]}  ==> system
echo ${parts[1]}  ==> source
echo ${parts[2]}  ==> yyyymmdd.dat

Предостережение: это не будет работать, если имя файла содержит "странные" символы, такие как пробел или, боже упаси, кавычки, обратные кавычки ...

8 голосов
/ 08 сентября 2008

В зависимости от ваших потребностей, 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 усовершенствованным мобильным телефоном; -)

7 голосов
/ 08 сентября 2008

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

, например

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

извлечет первый бит.

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

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

1 голос
/ 21 сентября 2008

Другой метод заключается в использовании внутренних инструментов синтаксического анализа оболочки, что позволяет избежать затрат на создание дочерних процессов:

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"
0 голосов
/ 06 июля 2018

Самый простой (и лучший способ IMO) сделать это - просто использовать 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
...