Скрипт оболочки Bash - разделенная строка ВКЛЮЧАЯ разделитель? - PullRequest
2 голосов
/ 03 апреля 2011

Мне интересно, есть ли простой способ разбить строку на массив и ВКЛЮЧИТЬ разделитель?

Например:

foo = "a;b;c;d;" 

Разобрать:

"a;" "b;" "c;" "d;"

Кажется, что большинство функций удаляют разделитель.

Редактировать: мне нужно закончить не выводом с отражением, а массивом, которым я потом смогу манипулировать в скрипте.Также, возможно, проще всего, если строку можно прочитать из текстового файла.

Ответы [ 5 ]

2 голосов
/ 03 апреля 2011
foo="a;b;c;d;"
for z in $(echo $foo | sed -r 's/([^;]+;)/\1 /g') 
do
  echo $z
done

a;
b;
c;
d;

(после редактирования) Как сделать массив:

# declare -a arr
arr=($(echo $foo | sed -r 's/([^;]+;)/\1 /g'))

Примечание. Как указывал Гленн, произойдет сбой, если пустые части построят часть содержимого.

В моем справочнике сказано, что я должен использовать declare -a для объявления массива, но в практике, похоже, он мне не нужен.

1 голос
/ 04 апреля 2011
foo='foo bar;abc def;ghi;jlk;'
oldIFS="$IFS"
IFS=\;
declare -a ary=($foo)
for ((i=0; i<${#ary[@]}; i++)); do ary[$i]="${ary[$i]}$IFS"; done
IFS="$oldIFS"
echo "${ary[1]}"  # ==> "abd def;"
1 голос
/ 03 апреля 2011
declare -a Array=($(echo 'a;b;c;' |cut -d';' --output-delimiter="; " -f1-))
echo ${Array[2]}
> c;
declare -a Array=($(echo 'a;b;c' |cut -d';' --output-delimiter="; " -f1-))
echo ${Array[2]}
> c

Это довольно грубо, но эй, это вроде работает. Вам понадобится другой разделитель, если на входе есть пробелы, так что это не идеально.

0 голосов
/ 04 апреля 2011

Вы можете изменить значение IFS внутри функции таким образом, чтобы значение IFS вне этой функции оставалось неизменным.

И вы также можете добавлять строки к каждому элементу массива без зацикливания.

0 голосов
/ 04 апреля 2011

Рубин (1,9 +)

$ array=( $(echo "a;b;c;d;" | ruby -e 'gets.chomp.scan(/(\w;)/).each{|x|print "%s " % x}') )
$ echo ${array[0]}
a;
$ echo ${array[1]}
b;
$ echo ${array[2]}
c;
$ echo ${array[3]}
d;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...