Подтвердить что ты не робот

Linux shell script: разделите строку, поместите их в массив, а затем проведите через них

Возможный дубликат:
Разделить строку на основе разделителя в Bash?

В bash script как я разделяю строку с разделителем типа ; и перебираю результирующий массив?

4b9b3361

Ответ 1

Вероятно, вы можете пропустить шаг явного создания массива...

Один трюк, который мне нравится использовать, - это установить разделитель между полями (IFS) на символ разделителя. Это особенно удобно для итерации через пробел или возврата результатов с разделителями любого из нескольких команд unix.

Ниже приведен пример использования точек с запятой (как вы упомянули в своем вопросе):

export IFS=";"
sentence="one;two;three"
for word in $sentence; do
  echo "$word"
done

Примечание: в регулярной настройке сценариев Bourne-shell и при экспорте IFS будет происходить на двух отдельных строках (IFS = 'x'; export IFS;).

Ответ 2

Здесь вариант ответа 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 - это может не только включить разделитель, но и отключить стандартные. Просто убедитесь, что вы сохранили его значение, прежде чем изменять его, как предложили другие.

Ответ 3

Если вы не хотите связываться с 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

Ответ 4

Вот пример кода, который вы можете использовать:

$ STR="String;1;2;3"
$ for EACH in `echo "$STR" | grep -o -e "[^;]*"`; do
    echo "Found: \"$EACH\"";
done

grep -o -e "[^;] *" выберет что-либо, что не является ';', поэтому разделив строку на ';'.

Надеюсь, что это поможет.

Ответ 5

sentence="one;two;three"
a="${sentence};"
while [ -n "${a}" ]
do
    echo ${a%%;*}
    a=${a#*;}
done