Как токенизировать строку в тире

Я читаю данные из строки, которая отформатирована как firstfield|secondfield|thirdfieldВ Bash я использую эту конструкцию для достижения этого:

i="firstfield|secondfield|thirdfield"
defaultIFS=$IFS
IFS="|"
set -- $i
arr=( $i )
IFS=$defaultIFS

FIRST=${arr[0]}
SECOND=${arr[1]}
THIRD=${arr[2]}

Можно ли получить $FIRST, $SECOND и $THIRD в тире без использования внешних программ, таких как awk/sed?

3 ответа

Вы можете использовать это, что также будет работать в bash:

IFS='|' read FIRST SECOND THIRD dummy << EOF
$i
EOF

Если всегда есть ровно 3 поля, вам не нужна фиктивная переменная. Обратите внимание, что нет необходимости сбрасывать переменную IFS, поскольку она используется локально для read команда.

cut с опцией -d часто делает эту работу.

i="firstfield|secondfield|thirdfield"  
echo $i | cut -d "|" -f1

-d "|" означает токенизировать строку с разделителем "|", затем -f1 получает первое поле, -f2 получает второе поле, -f3 получает третье поле.

Scrutinizer-х read метод работает, но вы также можете использовать set установить позиционные параметры ($1, $2 и т. д.), который примерно настолько близок к массиву, в который вы можете попасть dash, Если вы делаете это умно (используя local) это может быть весьма полезно.

Вот маленькая функция, которая разбивает $STRING на $SEPARATOR а потом уходит $CODE за каждый токен. Переменная $TOKEN устанавливается при вызове eval, так что вы можете использовать это. С помощью модификации вы также можете присвоить ей позицию токена. (И если вы делаете что-то продвинутое в вашем $CODE вы можете сбросить $IFS также.)

# Usage: foreach_token SEPARATOR STRING CODE
foreach_token() {
    local IFS="$1" STRING="$2" CODE="$3" TOKEN    # get args
    set -- $STRING                                # split $STRING on $IFS
    for TOKEN; do                                 # foreach $@
        eval "$CODE"
    done
}

Вызовите функцию следующим образом:

foreach_token "|" "firstfield|secondfield|thirdfield" 'echo "$TOKEN"'
Другие вопросы по тегам