Страница 1 из 1

sed. Команда в шаблоне замены

Добавлено: 2008-09-08 10:24:26
Termitnik
Добрый день!
Вопрос: можно ли в шаблон замены sed'a вставить команду, т.е. возможна ли конструкция:
sed "s/`command1|command2`/some text/"
Ругается bad flag in substitute command
Как сделать?

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 10:36:58
zg
можно, только нужно понимать, что и как будет работать:
1. первое, что выполнится - command1
2. вывод первой команды пойдёт на конвеер к command2
3. вывод второй команды подставится в "s/`..`/some text/" вместо обратных кавычек, и при этом переводы строк заменятся на пробелы
4. вызовется сед, которому будет передана строка, получившаяся в двойных кавычках.

то есть, чтобы проверить будет или не будет работать, нужно сначало запустить

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

echo "s/`command1|command2`/some text/"
и проверить, правильно ли скоструировался скрипт седа.

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 10:56:29
Termitnik
zg писал(а):то есть, чтобы проверить будет или не будет работать, нужно сначало запустить

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

echo "s/`command1|command2`/some text/"
и проверить, правильно ли скоструировался скрипт седа.
Правильно. Но при запуске sed ругается bad flag in substitute command: 's', т.е. первая буква текста замены воспринимается sed'ом как флаг. Как это обойти?

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 11:36:16
zg

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

zg# echo 'Hello ' | sed -e 's/ / World/'
Hello World
zg# 
:roll: у меня всё пашет

выложи вывод echo

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 11:48:22
Termitnik
bash-2.05$ echo "s/`cat /etc/file|grep vlan|tail -1`/some text/"
s/vlan 19 192.168.18.1/24/some text/
Я так понял, проблема в слеше между ip и маской. Как можно его заэкранировать? Пробовал вывод конвейером передать sed'у, типа |sed "s/\//\\//" или |sed "s/\//\\\//". Не помогает

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 12:07:51
zg
можно не экранировать

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

zg# echo 'Hello ' | sed -e 's! ! World!'
Hello World
zg#

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 12:26:33
Termitnik
zg писал(а):можно не экранировать
тогда ругается bad flag in substitute command

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 12:58:40
zg

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

zg# echo 'vlan 19 192.168.18.1/24' | sed -e 's\!vlan 19 192.168.18.1/24\!some text\!'
some text
zg# echo 'vlan 19 192.168.18.1/24' | sed -e 's~vlan 19 192.168.18.1/24~some text~'
some text
zg# 
8)

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 13:30:13
Termitnik
Спасибо! :drinks: Не знал, что sed'у подойдут тильды вместо слешей :oops: Невнимательно ман прочёл :oops: :oops:

Re: sed. Команда в шаблоне замены

Добавлено: 2008-09-08 13:40:56
zg
там по идее можно указывать любой символ, просто большенство являются управляющими