URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9277
[ Назад ]

Исходное сообщение
"Разбить строку на символы"

Отправлено gmananton , 10-Ноя-11 18:23 
Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
С awk недостаточно хорошо общался, но думаю, юзать надо его. Примерно так:
Пусть строка в файле имеет вид 123qwe_!**()skhf___
тогда
awk '/.*/' file
найдет любые символы. Вопрос - как записать каждый из них в отдельную переменную, да еще и при выходе из awk, который находится внутри shell-скрипта (это же получается subshell), не потерять эти переменные?

Содержание

Сообщения в этом обсуждении
"Разбить строку на символы"
Отправлено XoRe , 10-Ноя-11 23:17 
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> С awk недостаточно хорошо общался, но думаю, юзать надо его. Примерно так:
> Пусть строка в файле имеет вид 123qwe_!**()skhf___
> тогда
> awk '/.*/' file
> найдет любые символы. Вопрос - как записать каждый из них в отдельную
> переменную, да еще и при выходе из awk, который находится внутри
> shell-скрипта (это же получается subshell), не потерять эти переменные?

# echo '123qwe_!**()skhf___' | perl -e '$, = " "; while ($line = <STDIN>) { print (split //, $line); }'

1 2 3 q w e _ ! * * ( ) s k h f _ _ _


> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> как записать каждый из них в отдельную переменную

Вы определитесь, вам каждый символ в отдельную переменную, или строчку в массив?


"Разбить строку на символы"
Отправлено Andrey Mitrofanov , 11-Ноя-11 10:11 
> Пусть строка в файле имеет вид 123qwe_!**()skhf___
> тогда

Ж))) Какая _качественная строка! То * экспандится, то !. :)))

Не, я, конечно, написал цикл с while и аналогом substr-а на bash-е, **но** тот десяток вариантов, который не заработал до того -- просто _кричит, что постановка задачи неверна в части _выбора _инструмента...


"Разбить строку на символы"
Отправлено erera22 , 11-Ноя-11 16:31 
Формируем файл:
echo "1 2 fsd2 f3 f3as 1233" > /tmp/file
Считываем его в массив:
arr=($(cat /tmp/file))
Ну и вывод массива:
for i in ${arr[@]} ; do echo $i ; done
В результате:
1
2
fsd2
f3
f3as
1233

"Разбить строку на символы"
Отправлено Andrey Mitrofanov , 11-Ноя-11 19:34 
Во-первых, ему надь посимвольно, не по словам. Во-вторых, см.выше про * и ! .

"Разбить строку на символы"
Отправлено BillyBoy , 12-Ноя-11 17:33 
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.

Что за тупость. В shell любая  строка и так уже массив.
% str='123qwe_!**()skhf___'
% echo $str[5]
w


"Разбить строку на символы"
Отправлено shadowmaan , 12-Ноя-11 22:36 
>> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> Что за тупость. В shell любая  строка и так уже массив.
> % str='123qwe_!**()skhf___'
> % echo $str[5]
> w

Да, но это только в zsh. В bash, например, echo выведет

123qwe_!**()skhf___[5]


"Разбить строку на символы"
Отправлено BillyBoy , 13-Ноя-11 02:02 
> Да, но это только в zsh. В bash, например, echo выведет

аа, совсем я что-то выпал из реальности, совсем забыл что ещё кто-то остался на баше

В bash немножко сложнее (и надо помнить что элементы в массиве с нуля нумеруются в отличие от zsh, хотя строго говоря это не массив):
% str='123qwe_!**()skhf___'
%echo ${str:4:1}
w


"Разбить строку на символы"
Отправлено shadowmaan , 13-Ноя-11 02:23 
>> Да, но это только в zsh. В bash, например, echo выведет
> аа, совсем я что-то выпал из реальности, совсем забыл что ещё кто-то
> остался на баше
> В bash немножко сложнее (и надо помнить что элементы в массиве с
> нуля нумеруются в отличие от zsh, хотя строго говоря это не
> массив):
> % str='123qwe_!**()skhf___'
> Лho ${str:4:1}
> w

Действительно. И аргумент echo заключить в двойные кавычки чтобы
расширение не выполнялось.


"Разбить строку на символы"
Отправлено shadowmaan , 12-Ноя-11 23:03 
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> С awk недостаточно хорошо общался, но думаю, юзать надо его. Примерно так:
> Пусть строка в файле имеет вид 123qwe_!**()skhf___
> тогда
> awk '/.*/' file
> найдет любые символы. Вопрос - как записать каждый из них в отдельную
> переменную, да еще и при выходе из awk, который находится внутри
> shell-скрипта (это же получается subshell), не потерять эти переменные?

Можно примерно так

str='123qwe_!**()skhf___'
while [ -n "$str" ]; do
  temp=${str#?}  # все кроме первого символа
  char=${str%"$temp"}  # удаляем все, оставляя только первый символ
  echo "$char"  # обрабатываем символ как надо, например помещаем в массив
  str=$temp  # восстанавливаем строку, но уже без первого символа
done


"Разбить строку на символы"
Отправлено gmananton , 14-Ноя-11 20:44 

>   temp=${str#?}  # все кроме первого символа
>   char=${str%"$temp"}  # удаляем все, оставляя только первый символ

Идея прикольная, мне понравилось ) но сколько искал, не нашел - что за операторы такие
#? и %. особенно непонятно, как во втором случае работает


"Разбить строку на символы"
Отправлено shadowmaan , 14-Ноя-11 22:07 
>>   temp=${str#?}  # все кроме первого символа
>>   char=${str%"$temp"}  # удаляем все, оставляя только первый символ
> Идея прикольная, мне понравилось ) но сколько искал, не нашел - что
> за операторы такие
> #? и %. особенно непонятно, как во втором случае работает

# тут строка str, начиная с ее начала, сравнивается с шаблоном (? в данном случае любой символ)
совпадение удаляется, т.е. первый символ, остаток помещается в temp.

% сравнивает str с конца и удаляет совпадение с шаблоном, оставляя только первый символ.

Это я в какой-то книге видел. К сожалению не помню где.

А, вот нашел: Learning the bash Shell, 3rd Edition, By Cameron Newham, ISBN: 0-596-00965-8


"Разбить строку на символы"
Отправлено LSTemp , 26-Ноя-11 14:23 
>[оверквотинг удален]
>> shell-скрипта (это же получается subshell), не потерять эти переменные?
> Можно примерно так
> str='123qwe_!**()skhf___'
> while [ -n "$str" ]; do
>   temp=${str#?}  # все кроме первого символа
>   char=${str%"$temp"}  # удаляем все, оставляя только первый символ
>   echo "$char"  # обрабатываем символ как надо, например помещаем
> в массив
>   str=$temp  # восстанавливаем строку, но уже без первого символа
> done

[root@local 222]# cat ./sss
#!/bin/bash

str="abcdef"
for ((i=0; $i<${#str}; i=$(($i+1))))
do
echo "$i=${str:$i:1}"
done

[root@local 222]# ./sss    
0=a
1=b
2=c
3=d
4=e
5=f



"Разбить строку на символы"
Отправлено Teor , 20-Ноя-11 13:58 
Может кто-то подсказать как сделать тоже самое, но не для bash, а для tcsh?