3

Я только начал использовать sed и у меня возникли проблемы при использовании sed из Apache mod_seq. Задача состоит в том, чтобы изменить запись веб-службы на запись загрузки файла. Content-Type уже был изменен с помощью mod_headers, и задача здесь состоит в том, чтобы изменить тело запроса.

Тело запроса:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tracx.de/pkp/interfaces/msg/1.0" xmlns:ns1="http://tracx.de/pkp/interfaces/core/1.0"><soapenv:Header/><soapenv:Body><ns:test>Hello World</ns:test></soapenv:Body></soapenv:Envelope>



1) нормально протестируйте с помощью sed из командной строки:

sed "s/^.*$/--AaB03x\nContent-disposition: form-data; name=\"xmlfile\"; filename=\"myfile.xml\"\nContent-Type: text\/xml\n\n&\n--AaB03x--\n/" request.xml

Вывод, как и ожидалось, с переводом строки

--AaB03x
Content-disposition: form-data; name="xmlfile"; filename="myfile.xml"
Content-Type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tracx.de/pkp/interfaces/msg/1.0" xmlns:ns1="http://tracx.de/pkp/interfaces/core/1.0"><soapenv:Header/><soapenv:Body><ns:test>Hello World</ns:test></soapenv:Body></soapenv:Envelope>
--AaB03x--


2) вызов Sed с помощью Apache mod_sed:

InputSed "s/^.*$/--AaB03x\nContent-disposition: form-data; name=\"xmlfile\"; filename=\"myfile.xml\"\nContent-Type: text\/xml\n\n&\n--AaB03x--\n/"

Вывод из mod_sed при поступлении запроса в мое веб-приложение. Обратите внимание на "п" вместо новой строки.

--AaB03xnContent-disposition: form-data; name="xmlfile"; filename="myfile.xml"nContent-Type: text/xmlnn<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://tracx.de/pkp/interfaces/msg/1.0" xmlns:ns1="http://tracx.de/pkp/interfaces/core/1.0"><soapenv:Header/><soapenv:Body><ns:test>monday</ns:test></soapenv:Body></soapenv:Envelope>n--AaB03x--n


Я попытался с '' и '' я команда InputSed. И пробовал с 1, 2, 3 и 4 пробелами перед моими управляющими символами (\r и \n). Похоже, что Apache или mod_sed игнорируют символ обратной косой черты.

Кто-нибудь знает, есть ли какие-то особые проблемы с mod_sed и обратной косой чертой?

2 ответа2

2

Уродливый обходной путь, протестированный на Ubuntu Apache/2.4.18, с использованием поддерживаемого подмножества sed:

$ cat tmp
line3
$ sed "h;s/.*/line1/;p;s/.*/line2/;G;p;s/.*/line4/" tmp
line1
line2
line3
line4
$ cat week
sunday
wednesday
friday
$ sed "2{h;s/.*/monday/;p;s/.*/tuesday/;G;p;s/.*/thursday/;n;p;s/.*/saturday/;}" week
sunday
monday
tuesday
wednesday
thursday
friday
saturday
these work too as \n is still recognised in search string
"G;H;g;s/\n/line1&line2&/;s/\n$/&line4/"
"2{G;H;g;s/\n/monday&tuesday&/;s/\n$/&thursday/;n;p;s/.*/saturday/;}"
$ #sudo a2enmod sed
$ #apache2.conf
<Location /txt/>
    AddOutputFilter Sed txt
    OutputSed "G;H;g;s/\n/line1&line2&/;s/\n$/&line4/"
</Location>
$ service apache2 reload
$ wget localhost/txt/tmp.txt -qO -
line1
line2
line3
line4
$ #sudo a2enmod ext_filter
$ #apache2.conf
ExtFilterDefine external_sed mode=output intype=text/plain cmd="/bin/sed :0;N;$!b0;s/\\n//g"
<Location /txt/>
    SetOutputFilter external_sed
</Location>
$ service apache2 reload
$ wget localhost/txt/week.txt -qO -
sundaywednesdayfriday

Смотрите также: # 1, # 2

0

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

У меня нет опыта работы с mod_sed, но документ гласит:

mod_sed может использоваться как фильтр ввода или вывода. mod_sed - это фильтр содержимого, который означает, что его нельзя использовать для изменения заголовков http клиента или сервера.

mod_headers может быть более подходящим для того, что вы хотите сделать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .