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

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

system-source-yyyymmdd.dat

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
0
38 551
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

например

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

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

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

Вот руководство по команде Резать.

Ответ принят как подходящий

Вы можете использовать команда вырезания для доступа к каждому из 3 «полей», например:

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

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

Мне любопытно, почему вы добавили приглашение #. Обычно в этом приглашении указывается root или суперпользователь. В общем, я думаю, что такие вещи, как опробование команды резать, было бы лучше выполнять как обычный пользователь. Я бы использовал подсказку $.

Jon Ericson 09.09.2008 23:34

Ах да - хорошее замечание. Я должен признать, что в то время я был авторизован как root и просто пошел на это - плохая привычка, я знаю. Сказав это, я думаю, что echo и cut - две наименее вредные команды :) Но для полноты картины я обязательно сразу обновлю этот пример. Ваше здоровье.

Bobby Jack 10.09.2008 21:22

как я могу назначить вывод переменной? если я делаю, var = "system-source-yyyymmdd.dat" | cut -d'-' -f2 не работает.

EsseTi 13.10.2014 15:52

Потрясающе - ответ за 3 минуты - это быстрее, чем вызвать другу! - изначально добавлен как ответ, но был удален через 6 лет после того, как я задал вопрос :)

Nick Pierpoint 16.08.2016 19:46

В зависимости от ваших потребностей, awk более гибкий, чем cut. Первый тизер:

# echo "system-source-yyyymmdd.dat" \
    |awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
              ,,substr(,1,4),substr(,5,2),substr(,7,2)}'
System: system
Source: source
Year: yyyy
Month: mm
Day: dd

Проблема в том, что описывать awk как «более гибкий» - все равно что называть iPhone улучшенным мобильным телефоном ;-)

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

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

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

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

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

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

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

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

Другие вопросы по теме