




Используйте команду cut.
например
echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
извлечет первый бит.
Измените значение параметра -f, чтобы получить соответствующие детали.
Вот руководство по команде Резать.
Вы можете использовать команда вырезания для доступа к каждому из 3 «полей», например:
$ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
source
"-d" указывает разделитель, "-f" указывает номер требуемого поля.
Ах да - хорошее замечание. Я должен признать, что в то время я был авторизован как root и просто пошел на это - плохая привычка, я знаю. Сказав это, я думаю, что echo и cut - две наименее вредные команды :) Но для полноты картины я обязательно сразу обновлю этот пример. Ваше здоровье.
как я могу назначить вывод переменной? если я делаю, var = "system-source-yyyymmdd.dat" | cut -d'-' -f2 не работает.
Потрясающе - ответ за 3 минуты - это быстрее, чем вызвать другу! - изначально добавлен как ответ, но был удален через 6 лет после того, как я задал вопрос :)
В зависимости от ваших потребностей, 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
Мне любопытно, почему вы добавили приглашение #. Обычно в этом приглашении указывается root или суперпользователь. В общем, я думаю, что такие вещи, как опробование команды резать, было бы лучше выполнять как обычный пользователь. Я бы использовал подсказку $.