Как токенизировать строку в тире
Я читаю данные из строки, которая отформатирована как 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"'