Возможный дубликат:
Разделить строку на основе разделителя в Bash?
В bash script как я разделяю строку с разделителем типа ;
и перебираю результирующий массив?
Возможный дубликат:
Разделить строку на основе разделителя в Bash?
В bash script как я разделяю строку с разделителем типа ;
и перебираю результирующий массив?
Вероятно, вы можете пропустить шаг явного создания массива...
Один трюк, который мне нравится использовать, - это установить разделитель между полями (IFS) на символ разделителя. Это особенно удобно для итерации через пробел или возврата результатов с разделителями любого из нескольких команд unix.
Ниже приведен пример использования точек с запятой (как вы упомянули в своем вопросе):
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
echo "$word"
done
Примечание: в регулярной настройке сценариев Bourne-shell и при экспорте IFS будет происходить на двух отдельных строках (IFS = 'x'; export IFS;).
Здесь вариант ответа ashirazi, который не полагается на $IFS
. У него есть свои проблемы, о которых я рассказываю ниже.
sentence="one;two;three"
sentence=${sentence//;/$'\n'} # change the semicolons to white space
for word in $sentence
do
echo "$word"
done
Здесь я использовал новую строку, но вы можете использовать вкладку "\t
" или пробел. Однако, если какой-либо из этих символов находится в тексте, он тоже будет разделен. Что преимущество $IFS
- это может не только включить разделитель, но и отключить стандартные. Просто убедитесь, что вы сохранили его значение, прежде чем изменять его, как предложили другие.
Если вы не хотите связываться с IFS (возможно, для кода внутри цикла), это может помочь.
Если вы знаете, что ваша строка не будет иметь пробелов, вы можете заменить ";" пробелом и использовать конструкцию for/in:
#local str
for str in ${STR//;/ } ; do
echo "+ \"$str\""
done
Но если у вас может быть пробел, то для этого подхода вам нужно будет использовать временную переменную, чтобы удерживать "отдых" следующим образом:
#local str rest
rest=$STR
while [ -n "$rest" ] ; do
str=${rest%%;*} # Everything up to the first ';'
# Trim up to the first ';' -- and handle final case, too.
[ "$rest" = "${rest/;/}" ] && rest= || rest=${rest#*;}
echo "+ \"$str\""
done
Вот пример кода, который вы можете использовать:
$ STR="String;1;2;3"
$ for EACH in `echo "$STR" | grep -o -e "[^;]*"`; do
echo "Found: \"$EACH\"";
done
grep -o -e "[^;] *" выберет что-либо, что не является ';', поэтому разделив строку на ';'.
Надеюсь, что это поможет.
sentence="one;two;three"
a="${sentence};"
while [ -n "${a}" ]
do
echo ${a%%;*}
a=${a#*;}
done