The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Разбить строку на символы"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Разбить строку на символы"  +/
Сообщение от XoRe (ok) on 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 _ _ _


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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Разбить строку на символы"  +/
Сообщение от erera22 (ok) on 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
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Разбить строку на символы"  +/
Сообщение от Andrey Mitrofanov on 11-Ноя-11, 19:34 
Во-первых, ему надь посимвольно, не по словам. Во-вторых, см.выше про * и ! .
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Разбить строку на символы"  +/
Сообщение от BillyBoy email(ok) on 12-Ноя-11, 17:33 
> Надо чтобы любая строка посимвольно представлялась в виде элементов массива.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

123qwe_!**()skhf___[5]

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

8. "Разбить строку на символы"  +/
Сообщение от BillyBoy email(ok) on 13-Ноя-11, 02:02 
> Да, но это только в zsh. В bash, например, echo выведет

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

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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

7. "Разбить строку на символы"  +/
Сообщение от shadowmaan (ok) on 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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Разбить строку на символы"  +/
Сообщение от gmananton (ok) on 14-Ноя-11, 20:44 

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

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "Разбить строку на символы"  +/
Сообщение от shadowmaan (ok) on 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

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

13. "Разбить строку на символы"  +/
Сообщение от LSTemp (ok) on 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


Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

12. "Разбить строку на символы"  +/
Сообщение от Teor (ok) on 20-Ноя-11, 13:58 
Может кто-то подсказать как сделать тоже самое, но не для bash, а для tcsh?


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру