На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Модератор
Сообщения: 21433
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 24.06.2014 11:15
Она работает. Экранирование съедается шеллом при передаче аргумента echo .
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
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
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Модератор
Сообщения: 21433
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 24.06.2014 11:30
Кстати, здесь s/'/\\\'/g три обратных слеша смысла не имеют. С тем же успехом можно использовать два. Чтобы в последнем случае остался один - поставьте четыре. При условии, что само выражение в двойных кавычках, а не одинарных.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Модератор
Сообщения: 21433
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 24.06.2014 11:52
А, да, прошу прощения, это я ступил.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
kpocobok
Сообщения: 92
Сообщение
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
Сообщение
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/'"'"'/@/'
@ '
kpocobok
Сообщения: 92
Сообщение
kpocobok » 19.01.2015 16:08
Это конечно все хорошо. Просто заэкранировать и вывести получается. Но заменить нет....
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 19.01.2015 18:10
kpocobok писал(а): ↑ 19.01.2015 16:08
Но заменить нет....
что на что?
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64
Сообщение
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
Сообщение
kpocobok » 20.01.2015 13:12
Та не
Я по другому написал. Но все равно спасибо. Разобрался.