sed. экранировать одинарную кавычку в переменной

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

sed. экранировать одинарную кавычку в переменной

Сообщение nerve » 24.06.2014 10:48

Shell

$ cat test.txt <!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class='quotetop'>Цитатаbbb @ 7.9.2007, 16:28) $ sed "s/^[ \t]*//;s/'/\\\'/g" test.txt <!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class=\'quotetop\'>Цитатаbbb @ 7.9.2007, 16:28) $ cat sed.sh #!/bin/bash set -e sed "s/^[ \t]*//;s/'/\\\'/g" $1 $ ./sed.sh test.txt <!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class=\'quotetop\'>Цитатаbbb @ 7.9.2007, 16:28) $ cat sed.sh #!/bin/bash set -e V=`sed "s/^[ \t]*//;s/'/\\\'/g" $1` echo $V $ ./sed.sh test.txt <!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class='quotetop'>Цитатаbbb @ 7.9.2007, 16:28)


почему в последнем случае первая команда седа работает, а вторая - нет?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16122
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: sed. экранировать одинарную кавычку в переменной

Сообщение Bizdelnick » 24.06.2014 11:15

Она работает. Экранирование съедается шеллом при передаче аргумента echo.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4679
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: sed. экранировать одинарную кавычку в переменной

Сообщение SLEDopit » 24.06.2014 11:20

Оно работает в обоих случаях. Просто echo съедает экраны.

Код: Выделить всё

 $ set -x
 $ V=`sed "s/^[ \t]*//;s/'/\\\'/g" test.txt`
++ sed 's/^[ \t]*//;s/'\''/\'\''/g' test.txt
+ V='<!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class='\''quotetop'\''>Цитатаbbb @ 7.9.2007, 16:28)'
 $ echo "$V"
+ echo '<!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class='\''quotetop'\''>Цитатаbbb @ 7.9.2007, 16:28)'
<!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class='quotetop'>Цитатаbbb @ 7.9.2007, 16:28)


Если вам важно хранить \ в переменной, используйте

Код: Выделить всё

V=`sed "s/^[ \t]*//;s/'/\\\\\'/g" test.txt`


upd. что-то я долго печатал.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: sed. экранировать одинарную кавычку в переменной

Сообщение nerve » 24.06.2014 11:30

SLEDopit писал(а):
24.06.2014 11:20
Просто echo съедает экраны.
Если вам важно хранить \ в переменной, используйте

Код: Выделить всё

V=`sed "s/^[ \t]*//;s/'/\\\\\'/g" test.txt`

а можно здесь про пять экранов подробней объяснить? куда и кем по очереди они съедаются?
я понял так, что сед выполнился правильно, но потом, при отображении через echo один экран съедается, почему тогда надо 5 экранов, а не 4?
и еще, можно ли таким же образом экранировать двойные кавычки внутри строки, то есть чтоб после выполнения седа в переменной оставалось:
экранировать одинарные кавычки мне нужно чтоб занести строку с ними (и возможно другими символами) в mysql.
читал в php для этого есть специальная функция и понятное дело что shell неподходящее для этого средство.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16122
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: sed. экранировать одинарную кавычку в переменной

Сообщение Bizdelnick » 24.06.2014 11:30

Кстати, здесь s/'/\\\'/g три обратных слеша смысла не имеют. С тем же успехом можно использовать два. Чтобы в последнем случае остался один - поставьте четыре. При условии, что само выражение в двойных кавычках, а не одинарных.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 273
ОС: OpenBSD

Re: sed. экранировать одинарную кавычку в переменной

Сообщение nerve » 24.06.2014 11:45

Bizdelnick писал(а):
24.06.2014 11:30
Кстати, здесь s/'/\\\'/g три обратных слеша смысла не имеют. С тем же успехом можно использовать два. Чтобы в последнем случае остался один - поставьте четыре. При условии, что само выражение в двойных кавычках, а не одинарных.

Код: Выделить всё

$ cat sed.sh
#!/bin/bash
set -e
V=`sed "s/^[ \t]*//;s/'/\\\\'/g" $1`
echo $V
$ ./sed.sh test.txt
<!--quoteo(post=97815:date=7.9.2007, 16:28:name=bbb)--><div class='quotetop'>Цитатаbbb @ 7.9.2007, 16:28)

Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16122
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: sed. экранировать одинарную кавычку в переменной

Сообщение Bizdelnick » 24.06.2014 11:52

А, да, прошу прощения, это я ступил.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
kpocobok
Сообщения: 92

Re: sed. экранировать одинарную кавычку в переменной

Сообщение kpocobok » 19.01.2015 15:47

Похожая проблема. Уже сутки бьюсь.

# cat text.txt
$rr['one']['two'] = "123423521"
# find -type f -name \text.txt -exec sed -i 's/$rr['one']['two'].*/123/g' {} \;


Текст не заменяется. Мне сказали про экранирование, но я не могу понять как тут заэкранировать одинарные ковычки и квадратные скобки.
Хелп плиз =)
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sed. экранировать одинарную кавычку в переменной

Сообщение drBatty » 19.01.2015 16:04

kpocobok писал(а):
19.01.2015 15:47
Текст не заменяется. Мне сказали про экранирование, но я не могу понять как тут заэкранировать одинарные ковычки и квадратные скобки.

Shell

$ echo "ABC" |sed 's/./\x27/g ''' $ echo "A[[]]C" |sed 's/\[/{/g; s/\]/}/g' A{{}}C



kpocobok писал(а):
19.01.2015 15:47
-exec sed -i 's/$rr['one']['two'].*/123/g' {} \;

хоть бы писали какой шелл

bash

Код: Выделить всё

drb@amilo:~$ VAR="A B C"
drb@amilo:~$ declare -A ARRAY
drb@amilo:~$ ARRAY[$VAR]="X Y Z"
drb@amilo:~$ echo "'${ARRAY[$VAR]}'"
'X Y Z'


другой вариант одиночной кавычки в двойной кавычке:

$

echo "' '"|sed 's/'"'"'/@/' @ '

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
kpocobok
Сообщения: 92

Re: sed. экранировать одинарную кавычку в переменной

Сообщение kpocobok » 19.01.2015 16:08

Это конечно все хорошо. Просто заэкранировать и вывести получается. Но заменить нет....
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: sed. экранировать одинарную кавычку в переменной

Сообщение drBatty » 19.01.2015 18:10

kpocobok писал(а):
19.01.2015 16:08
Но заменить нет....

что на что?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: sed. экранировать одинарную кавычку в переменной

Сообщение NickLion » 19.01.2015 18:27

kpocobok

Код: Выделить всё

nicklion@warlock:~/tmp> echo "\$rr['one']['two'] = \"123423521\"" > text.txt; cat text.txt
$rr['one']['two'] = "123423521"
nicklion@warlock:~/tmp> sed -i "s/\$rr\\['one'\\]\\['two'\\].*/123/g" text.txt; cat text.txt
123

Спасибо сказали:

Аватара пользователя
kpocobok
Сообщения: 92

Re: sed. экранировать одинарную кавычку в переменной

Сообщение kpocobok » 20.01.2015 13:12

Та не :) Я по другому написал. Но все равно спасибо. Разобрался.
Спасибо сказали: