2008-09-08 3 views

ответ

29

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

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

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

+0

Мне любопытно, почему вы добавили # подсказку. Обычно это приглашение указывает на root или суперпользователя. В общем, я бы подумал, что такие вещи, как опробовать команду ** cut **, будут лучше выполняться как обычный пользователь. Я бы использовал приглашение $. – 2008-09-09 19:34:27

7

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

например.

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

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

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

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

8

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

1

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

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

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

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

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

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

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