Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
С awk недостаточно хорошо общался, но думаю, юзать надо его. Примерно так:
Пусть строка в файле имеет вид 123qwe_!**()skhf___
тогда
awk '/.*/' file
найдет любые символы. Вопрос - как записать каждый из них в отдельную переменную, да еще и при выходе из awk, который находится внутри shell-скрипта (это же получается subshell), не потерять эти переменные?
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> С 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 _ _ _
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> как записать каждый из них в отдельную переменнуюВы определитесь, вам каждый символ в отдельную переменную, или строчку в массив?
> Пусть строка в файле имеет вид 123qwe_!**()skhf___
> тогдаЖ))) Какая _качественная строка! То * экспандится, то !. :)))
Не, я, конечно, написал цикл с while и аналогом substr-а на bash-е, **но** тот десяток вариантов, который не заработал до того -- просто _кричит, что постановка задачи неверна в части _выбора _инструмента...
Формируем файл:
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
Во-первых, ему надь посимвольно, не по словам. Во-вторых, см.выше про * и ! .
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.Что за тупость. В shell любая строка и так уже массив.
% str='123qwe_!**()skhf___'
% echo $str[5]
w
>> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> Что за тупость. В shell любая строка и так уже массив.
> % str='123qwe_!**()skhf___'
> % echo $str[5]
> wДа, но это только в zsh. В bash, например, echo выведет
123qwe_!**()skhf___[5]
> Да, но это только в zsh. В bash, например, echo выведетаа, совсем я что-то выпал из реальности, совсем забыл что ещё кто-то остался на баше
В bash немножко сложнее (и надо помнить что элементы в массиве с нуля нумеруются в отличие от zsh, хотя строго говоря это не массив):
% str='123qwe_!**()skhf___'
%echo ${str:4:1}
w
>> Да, но это только в zsh. В bash, например, echo выведет
> аа, совсем я что-то выпал из реальности, совсем забыл что ещё кто-то
> остался на баше
> В bash немножко сложнее (и надо помнить что элементы в массиве с
> нуля нумеруются в отличие от zsh, хотя строго говоря это не
> массив):
> % str='123qwe_!**()skhf___'
> Лho ${str:4:1}
> wДействительно. И аргумент echo заключить в двойные кавычки чтобы
расширение не выполнялось.
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.
> С 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
> temp=${str#?} # все кроме первого символа
> char=${str%"$temp"} # удаляем все, оставляя только первый символИдея прикольная, мне понравилось ) но сколько искал, не нашел - что за операторы такие
#? и %. особенно непонятно, как во втором случае работает
>> temp=${str#?} # все кроме первого символа
>> char=${str%"$temp"} # удаляем все, оставляя только первый символ
> Идея прикольная, мне понравилось ) но сколько искал, не нашел - что
> за операторы такие
> #? и %. особенно непонятно, как во втором случае работает# тут строка str, начиная с ее начала, сравнивается с шаблоном (? в данном случае любой символ)
совпадение удаляется, т.е. первый символ, остаток помещается в temp.% сравнивает str с конца и удаляет совпадение с шаблоном, оставляя только первый символ.
Это я в какой-то книге видел. К сожалению не помню где.
А, вот нашел: Learning the bash Shell, 3rd Edition, By Cameron Newham, ISBN: 0-596-00965-8
>[оверквотинг удален]
>> 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/bashstr="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
Может кто-то подсказать как сделать тоже самое, но не для bash, а для tcsh?