Подтвердить что ты не робот

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

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

system-source-yyyymmdd.dat

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

например.

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

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

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

Здесь приведено руководство по Cut.

Ответ 5

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

oIFS=$IFS
IFS=-
file="system-source-yyyymmdd.dat"
set $file
IFS=$oIFS
echo "Source is $2"