powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell - убрать одинаковые символы в строке.
36 сообщений из 36, показаны все 2 страниц
shell - убрать одинаковые символы в строке.
    #33259614
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть строка - *###PP##
Количество решёток, звёздочек, букв P может варьироваться от 1 до 3-х. Как
бы это хозяйство упорядочить, чтобы на выходе получить *#P# (это из той же
задачки где с компорта данные, это такое регулярное выражение чтоб поймать
звонок по IP-телефонии). Что-то у меня идей совсем нет... А запускать перл
для этого - совсем не хочется :(
Хочется на shеll - от начала и до конца.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259645
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. нужно склеить повторяющиеся символы в один?
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259792
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259816
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет! Суперизврат! :-)

echo "###P#ZZZf" | awk '{for(i=1;i<=length($1);i++)print substr($1,i,1)}' | uniq | awk '{main=main "" $1}END {print main}'
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259925
Alex Roudnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--привет! Суперизврат! :-)

echo "###P#ZZZf" | awk '{for(i=1;i<=length($1);i++)print substr($1,i,1)}' | uniq | awk '{main=main "" $1}END {print main}'

Ну если вы точно знаете, что повторяются ТОЛЬКО # и P, то не проще ли

sed 's/PP*/P/g;s/##*/#/g'

??
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259960
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, конечно - и это гораздо эффективнее , но мне просто было интересно рассмотреть общий случай исходя из топика. Если набор символов четко известен то sed конечно.
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259979
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, мой первый вариант позорен и неуклюж.
Вот удаление всех повторений


Код: plaintext
echo "###P#ZZZf"  | sed s/\(.\)\ 1 */\ 1 /g
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259983
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остановился на такой конструкции
Код: plaintext
1.
/dev/>echo "**###PPP#######" | sed 's/PP*/P/g;s/##*/#/g;s/\*\**/\*/g'       
*#P#
Хотя на awk мне больше понравилось. И кстати, действительно, универсальней - если повторяются не только одни и теже символы....
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259985
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
/dev/>echo "**###PPP#######" | sed s/\(.\)\ 1 */\ 1 /g
sed: No match.
/dev/>
А первый работал.
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259987
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой а у меня работает.

Код: plaintext
1.
2.
echo "**###PPP#######" | sed s/\(.\)\ 1 */\ 1 /g

"*#P#"


версия sed что ли или что-то такое?

Код: plaintext
1.
sed --v
GNU sed version  3 . 02 
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259991
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
# sed -v
sed: illegal option -- v
usage: sed script [-Ean] [-i extension] [file ...]
       sed [-an] [-i extension] [-e script] ... [-f script_file] ... [file ...]
You have new mail.
# sed --v
ждёт чего-то
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259992
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немогу добиться версии :( Он переходит в интерактивный режим, чтоли и по sed --ver и по sed --v и ни на что не реагирует кроме CTRL-C.....

На 4.9 и на 4.11 фре пробовал... Одно и тоже...
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33259995
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
некоторые старенькие (sedенькие :-)) sed-ы кстати в такой ситуации хотят чтобы их защитили - что-то типа

Код: plaintext
1.
2.
3.
4.
echo "**###PPP#######" | sed "s/\(.\)\1*/\1/g"

или даже

echo "**###PPP#######" | sed -e "s/\(.\)\1*/\1/g"
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260001
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, так
Код: plaintext
echo "**###PPP#######" | sed 's/\(.\)\1*/\1/g'
на фре работает. Они не седенькие, они традиционные)
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260005
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, кстати, всё равно при своём варианте остаюсь :) Там я хоть понимаю что происходит. А тут набор символов - и на выходе то ,что надо. Шаманство. :)

Ещё момент - sed при первом запуске тормозит неслабо. На 4-м пне по полсекунды думает. А вот awk сразу результат выдал. Правда повторные запуски на глаз разницы не вызвили :)
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260010
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю, разница во времени - медленнее тот, который первым вызывался, а дальше файловый кеш уже работал.
Так вообще обычно awk все же помедленнее стартует, когда-то проводил соревнования :-)

К тому же если иметь в виду пример от 19:37 - то в нем сделано все, чтобы стать неэффективным - два конвейра, первый awk посимвольно все разворачивает, потом unuq, а потом awk все сворачивает опять же посимвольно. Это должно быть ну оч-чень медленно!
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260032
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--Сорри, мой первый вариант позорен и неуклюж.
Вот удаление всех повторений


Код: plaintext
echo "###P#ZZZf"  | sed s/\(.\)\ 1 */\ 1 /g


Null
круто.
)))))))
я б, наверно, не сообразил бы
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260159
no-dashi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дети, скажите echo "#####PPPPP####" | tr -s "#P" и не мучайтесь! :-)
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260229
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клёво :)
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260293
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no-dashiДети, скажите echo "#####PPPPP####" | tr -s "#P" и не мучайтесь! :-)
Вариант от --null-- (sed "s/\(.\)\1*/\1/g") представляет собой общее решение, когда набор входящих символов заранее неизвестен, а потому с моей точки зрения является более предпочтительным и более "взрослым" (профессиональным).
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260345
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо :)
Но что-то шаблонное мышление (sed/awk) иногда подводит - tr действительно
вариант весьма прикольный.
Думаю, вот универсальный для tr для ASCII кодировки:

Код: plaintext
echo "#####PPPPP##P##" | tr -s ["\000"-"\177"]
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260415
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кончилось всё вот так:
Код: plaintext
1.
kuda_zvonili=`echo ${incoming} | tr -s "\*" | awk -F \* '{print $2}' | 
tr -s "#" | awk -F \# '{print $3}'`



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260526
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--спасибо :)
Но что-то шаблонное мышление (sed/awk) иногда подводит - tr действительно
вариант весьма прикольный.
Думаю, вот универсальный для tr для ASCII кодировки:

Код: plaintext
echo "#####PPPPP##P##" | tr -s ["\000"-"\177"]


Тут речь идет об IP-телефонии, поэтому можно предположить, что цифр это касаться не должно. Как это будет выглядеть на tr (практичекси никогда его не использую)? Так
Код: plaintext
1.
tr -s ["\000"-"\057","\072"-"\177"]
?

На sed
Код: plaintext
1.
sed "s/\([^0-9]\)\1*/\1/g"
В данном случае на sed букв меньше
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260535
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyara
А кончилось всё вот так:
Код: plaintext
1.
kuda_zvonili=`echo ${incoming} | tr -s "\*" | awk -F \* '{print $2}' | 
tr -s "#" | awk -F \# '{print $3}'`

А как incoming выглядит в общем случае?


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260540
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyara
А кончилось всё вот так:
Код: plaintext
1.
kuda_zvonili=`echo ${incoming} | tr -s "\*" | awk -F \* '{print $2}' | 
tr -s "#" | awk -F \# '{print $3}'`



Posted via ActualForum NNTP Server 1.3
Еще раз :)
А как incoming выглядит в общем случае?
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260615
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
 7830127 *##PPxxxxxx# 78672518525 
 7830127 *#PPPхххххх# 78672518525 #
 7830127 *#PPххххххх# 78672518525 
 7830127 *#PPххххххх# 78672362532 ##

Маленькие иксы - пароль доступа. Несколько цифр. Его набирает сама АТС,
потому это та часть которая стабильна :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260645
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyara
Код: plaintext
1.
2.
3.
 7830127 *##PPxxxxxx# 78672518525 
 7830127 *#PPPхххххх# 78672518525 #
 7830127 *#PPххххххх# 78672518525 
 7830127 *#PPххххххх# 78672362532 ##

Маленькие иксы - пароль доступа. Несколько цифр. Его набирает сама АТС,
потому это та часть которая стабильна :)


Posted via ActualForum NNTP Server 1.3

Так для таких номеров это равносильно просто
Код: plaintext
1.
echo ${incoming} |  awk -F \# '{print $3}'

??????
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260678
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
давайте еще помусолим :-)


Очень эффективно обработать без конвейров, одним awk-ом
к сожалению в варианте

Код: plaintext
echo ${incoming} |  awk -F \# '{print $3}'
первая строчка обрабатывается некорректно

я бы предложил

Код: plaintext
cat incoming  | awk -F\#* '{if(!length($NF)==0){print $NF} else print $(NF-1)}'


т.е. как разделитель регулярка рулит
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260683
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шизую...

Код: plaintext
cat incoming  | awk -F\#* '{print $3}'

:-)
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260686
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же не совсем дурак....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
/usr/home/lissyara/>echo "7830127*###PPxxxxxx##78672518525" | awk -F \# 
'{print $6}'
 78672518525 
/usr/home/lissyara/>echo "7830127*##PPxxxxxx##78672518525" | awk -F \# 
'{print $6}'

/usr/home/lissyara/>



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260687
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot v6y]
Так для таких номеров это равносильно просто
Код: plaintext
1.
echo ${incoming} |  awk -F \# '{print $3}'

/quot]
Тьфу ты блин, конечно же имелось ввиду
Код: plaintext
1.
echo ${incoming} |  awk -F  "[#]+"  '{print $3}'

Под Линуксом можно и так
Код: plaintext
1.
echo ${incoming} |  awk -F  "#+"  '{print $3}'
но фиг его знает как оно под БСД среагирует
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260689
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вначале их надо полюбому по одному сделать (шарпы)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260698
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем если мы говорим "бери разделителем символ или такие символы подряд как один". И awk это поймет. И простит :-)
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260700
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyara
Вначале их надо полюбому по одному сделать (шарпы)


Posted via ActualForum NNTP Server 1.3
Очепятался я, уже исправил Почитай лучше про регулярные выражения
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260704
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 v6y
а последний вариант пашет.
awk -F "[#]+" '{print $3}'


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
shell - убрать одинаковые символы в строке.
    #33260716
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lissyara
2 v6y
а последний вариант пашет.
awk -F "[#]+" '{print $3}'


Posted via ActualForum NNTP Server 1.3

А куда он денется? Это означает: Разделителем между полями есть один и более символов '#'
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell - убрать одинаковые символы в строке.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]