Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
1

Не получается корректно заменить символы (sed)

22.05.2017, 12:29. Показов 2428. Ответов 6
Метки нет (Все метки)

Необходимо заменить символы в тексте. Одиночные на группу.

a/bb
b/cc
c/dd

Т.е. abc должно превратиться в bbccdd

Пишу
Bash
1
echo abc | sed 's/a/bb/g;s/b/cc/g;s/c/dd/g'
получаю dddddddddddddd (что, логично, естественно).
а нужно bbccdd

Перепробовал много вариантов, в т.ч. сначала разбивая слово на буквы с новых строк и прописывая замену не глобально. Нет. Всё то же.
и ничего не получается.

Если кто-то знает относительно элегантное решение данной задачи на sed покажите пожалуйста. Если не знаете как на sed тогда подскажите хотя бы как сделать это средствами bash или awk...

Добавлено через 23 минуты
В любом случае, первый шаг это пустить символы с новых строк, иначе будет каша.
sed '/s/./&\n/g'
дальше нужно чтобы sed заменил однократно символ на группу символов и перешел к новой строке.

Я писал:

Bash
1
echo abc | sed 's/./&\n/g' | sed ':x; /a/ { N ; s/a/bb/g ; bx }; /b/ { N ; s/b/cc/g ; bx }; /c/ { N ; s/c/dd/g ; bx }'
итог:

dddddddd
dddd
dd

Опять не то.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2017, 12:29
Ответы с готовыми решениями:

Sed: заменить только первое найденное либо в интервале строк
Привет всем! По образу и подобию создал скрипт (bash), который парсит файлы утилитой 'sed'...

Не корректно отображаются русские символы
Здравствуйте, ребята! Я выгружаю таблицу из mssql в excel c помощью bcp set @sql='exec...

Работа с текстовыми файлами. Произвольные символы заменить на символы, введенные с клавиатуры
Ребята, помогите пожалуйста! Задали задачку по программированию вот условие: В выбранном текстовом...

Не получается корректно скопировать форму
Всем доброго вечера. Пытаюсь скопировать форму из одного шаблона (на красном фоне) в другой. Но...

6
3442 / 1430 / 242
Регистрация: 10.12.2013
Сообщений: 4,903
22.05.2017, 18:37 2
Bash
1
perl -pe '%x = (a=>"bb", b=>"cc", c=>"dd"); s`(.)`$x{$1}//$1`eg'
1
Эксперт NIX
1555 / 612 / 216
Регистрация: 28.06.2015
Сообщений: 1,337
Записей в блоге: 16
22.05.2017, 22:51 3
Может так?
Bash
1
sed -n '{s/.*a.*/bb/;h};{s/.*b.*/cc/;H};{s/.*c.*/dd/;H};g;s/\n//g;p' <<<abc
Добавлено через 31 минуту
Вот так будет правильно
Bash
1
sed -n 's/a/BB/g;s/b/CC/g;s/c/DD/g;s/.*/\L&/p' <<<abc
Bash
1
sed -n 's/a/BB/g;s/b/CC/g;s/c/DD/g;s/.*/\L&/p' <<<aabcbc
Добавлено через 7 минут
А вообще лучше написать скрипт и делать сперва замены на любые не встречающиеся в
тексте символы, а уже потом заменять их на нужные. Тогда можно будет заменять
буквы в разных регистрах.

Добавлено через 25 минут

Bash
1
sed 's/c/dd/g;s/b/cc/g;s/a/bb/g' <<<aabcbc
0
3442 / 1430 / 242
Регистрация: 10.12.2013
Сообщений: 4,903
23.05.2017, 13:56 4
Bash
1
perl6 -pe '.=trans("a"=>["bb"], "b"=>["cc"], "c"=>["dd"])'
0
Модератор
Эксперт NIX
2784 / 2032 / 680
Регистрация: 02.03.2015
Сообщений: 6,513
23.05.2017, 19:50 5
Лучший ответ Сообщение было отмечено Hermod как решение

Решение

Цитата Сообщение от nezabudka Посмотреть сообщение
на любые не встречающиеся в
тексте символы, а уже потом заменять их на нужные
Bash
1
2
3
4
5
sed '
    s/[abc]/&\n/g;
    s/a\n/bb/g;
    s/b\n/cc/g;
    s/c\n/dd/g'
1
7 / 6 / 4
Регистрация: 21.05.2017
Сообщений: 60
23.05.2017, 22:00  [ТС] 6
volodin661, спасибо. Не удивлен что на перле это относительно легко делается
Цитата Сообщение от nezabudka Посмотреть сообщение
А вообще лучше написать скрипт и делать сперва замены на любые не встречающиеся в
тексте символы, а уже потом заменять их на нужные.
Так к сожалению нельзя. В той кодировке замены содержат одинаковые символы (a/abbc;b/abcc; c/aabc к примеру). По сему всё-равно каша будет на выходе. Регистры тоже менять нельзя, да и временные символы в подстановки вводить не хотелось бы. Входной текст неизвестен и может содержать что угодно.

Marinero, по-моему ваш вариант идеально подходит. Буду тестировать.
0
3442 / 1430 / 242
Регистрация: 10.12.2013
Сообщений: 4,903
24.05.2017, 06:14 7
Цитата Сообщение от Hermod Посмотреть сообщение
volodin661, Не удивлен что на перле это относительно легко делается
да, месье знает толк в извращениях;

через управляемый backtracking:

Bash
1
2
3
4
5
6
7
8
9
10
perl -nE '
             /
a (?{print "bb"})(*SKIP)(*FAIL)
|
b (?{print "cc"})(*SKIP)(*FAIL)
|
c (?{print "dd"})(*SKIP)(*FAIL)
|
. (?{print  $& })(*SKIP)(*FAIL)
             /x'
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2017, 06:14

Заглавные символы кириллицы заменить на строчные латинские символы
Здравствуйте!Помогите пожалуйста решить вот эту задачку в Far менеджере.=(Заранее очень вам...

Заменить все латинские символы «а» на символы «А» во введенной строке
здравствуйте. помогите разработать программу, ввода строковых данных с клавиатуры. Нужно...

Как в UnicodeString быстро заменить символы на другие символы ?
Собственно, в названии темы вопрос. Например : String Data = &quot;12.10.2012&quot;; Как быстро,...

Заполнить матрицу А[N,M] с файла символами, если символы повторяются в рядах то эти же символы заменить на их коды.
Заполнить матрицу А с файла символами, если символы повторяются в рядах то эти же символы заменить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.