LINUX.ORG.RU

Экранирование слэш для sed

 


0

1

Приветствую ALL,

Возникла небольшая проблема с обработкой строки вида ываыв\ываыва\ываыва строка передается в виде переменной в конструкции

echo $I | sed -e /s/... и т.д.

Проблема в том что sed слэш воспринимает как символ экранирования и из строки его убирает :(

Вариантов два вычитал: пропускать переменную $I еще раз через sed и подставлять в начало и конец строки символ '

или сделать как то добавление ' средствами echo, например echo \'$I\'

Может быть есть другой идеологически более правильный метод для данной ситуации?

ps. man sed читал.

★★★★★

Последнее исправление: irton (всего исправлений: 1)

Не совсем понял, что нужно, но libastral.so подсказывает, что в sed работают не только конструкции вида s/a/b/, но и s&a&b& и s%a%b%

kir@gentoo ~ $ echo aaabbb|sed s%aaa%ccc%
cccbbb

kir64 ★★
()
Ответ на: комментарий от minakov
[elemashine@laptop ~]$ i='g g dshgdhsagd ashgd\ sa\dsadasda sdsa\d asasd sa\';echo $i|sed -e s/g/f/g
f f dshfdhsafd ashfd\ sa\dsadasda sdsa\d asasd sa\
[elemashine@laptop ~]$ i="g g dshgdhsagd ashgd\ sa\dsadasda sdsa\d asasd sa\";echo $i|sed -e s/g/f/g
> ^C

Кавычки

minakov ★★★★★
()
Ответ на: комментарий от kir64

нет, он в двойные кавычки, похоже, все значения переменных засовывает, а они позволяют \x41\n\Ы и так далее, в отличие от

minakov ★★★★★
()
Последнее исправление: minakov (всего исправлений: 1)
Ответ на: комментарий от minakov

Ах, вот оно что. Значит, меня не в ту степь увело.

До сих пор не могу научиться корректно парсить потоки мыслей.

kir64 ★★
()
Ответ на: комментарий от kir64

Я на два раза это перечитал, прежде чем заголовок только распарсить... Но в итоге может оказаться, что автор имел в виду нечто другое: например работает он с битами/байтами/хексами вперемежку с символами, вот и нужно ему все-таки закидывать все в одинарные после двойных. Но тогда ему будет грустно, когда он дойдет до \x27

minakov ★★★★★
()

Remember shell.

anonymous
()
Ответ на: комментарий от minakov

Да, конструкция что вы привели в первом примере у меня работает, но проблема в том что строка изначально не экранирована 'sfsdfs'

вопрос в том в каком месте и как правильнее ее экранировать?

irton ★★★★★
() автор топика

Use perl and \Q...\E

anonymous
()
Ответ на: комментарий от irton

Нууу... Из идиотских решений - cat file.sh|sed -e s/\«/\'/g > file_with_converted_quotes.sh
Из нормальных - руками логику пересмотреть, учитывая особенности shell по отношению к разным кавычкам, либо сменить ЯП

minakov ★★★★★
()
Ответ на: комментарий от minakov

Вы не поняли, изначально в строке нет кавычек т.е. она sfsfsf\sfsdf\sdfsdf мне надо как то сделать чтобы слэши не обрабатывал sed

как мы выяснили в вашем примере, чтоб не обрабатывались слэши, надо заэкранировать все ' в начале и ' в конце обрабатываемой строки. Как преобразовать переменную чтоб в ней добавились эти апострофы ....

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

Зачем? У тебя переменная как объявляется? Если i=«gdfg hdg\ hdgg\g dh\», то просто замени эти на одинарные. В гайдах по башу на первых страницах описаны кавычки, чтобы не мучались люди. Или ты переменные объявляешь без кавычек совсем?

minakov ★★★★★
()
Ответ на: комментарий от minakov

И вообще, если с такой ситуацией часто встречаешься, лучше баш на перл хотя бы сменить и printf(«%s», «что-д'*уше \<[|уг\%одн&о») делать

minakov ★★★★★
()
Ответ на: комментарий от minakov

Строка берется из входного файла, стандартная вроде конструкция:

cat file.txt | while read I

do

echo $I | sed 's/......

done

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

Вооот. И мы практически уперлись в мою проблему с \x27. Я решил это исключением echo из скриптов, написал тупой транслятор ввода в вывод(смотри тред как я на эхо ругался) на Си и лишился проблем с экранированием. Если нужно будет, код сниппета приложу, если захочешь сам разобраться, это в главе про putc у К&Р. Более верного решения не нашел

minakov ★★★★★
()
Ответ на: комментарий от anonymous

попробую.

Я и не считаю что проблема в sed, нужно просто передать на вход sed строку в таком виде чтобы sed не обрабатывал знаки \ в строке. И у меня как раз и проблема в том, как правильно подкготовить строку к обработке.

irton ★★★★★
() автор топика
Ответ на: комментарий от minakov

Из идиотских решений - cat file.sh|sed -e s/\«/\'/g

Действительно, идиотских.

akk ★★★★★
()

Кавычки же ... хотя может работать только в BASH. echo «$I»|sed -e s/...

saper ★★★★★
()

всем спасибо, помогло чтение через read -r

while read -r I

do

...

done<input.txt

printf кстати вобще выводить отказался жалуясь на неправильные символы юникода

irton ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.