mod_sed - apache + sed - problemas com barra invertida

3

Acabei de começar a usar o sed e estou tendo um problema ao usar o sed a partir do Apache mod_seq. A tarefa é alterar uma publicação de serviço da web para uma postagem de upload de arquivo. O Content-Type já foi alterado usando mod_headers e a tarefa aqui é alterar o corpo da solicitação.

Solicitar corpo:

<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) teste ok com sed no prompt de comando:

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

Saída conforme esperado com novas linhas:

--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) Chamada Sed com o Apache mod_sed:

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

Saída de mod_sed quando a solicitação entrar no meu aplicativo da web. Anote "n" em vez de nova linha.

--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


Eu tentei com o comando '' e '' i InputSed. E tentei com 1, 2, 3 e 4 backspaces antes dos meus caracteres de controle (\ r e \ n). Parece que o Apache ou o mod_sed estão ignorando o caractere de barra invertida.

Alguém que sabe se há alguns problemas especiais com mod_sed e backslash?

    
por jaros1b 22.12.2014 / 13:35

2 respostas

2

Solução alternativa feia testada no Ubuntu Apache / 2.4.18, usando o subconjunto suportado do 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

Veja também: # 1 , #2

    
por 14.06.2018 / 13:10
0

Se você quiser substituir uma única linha de texto por várias linhas de texto, tente a resposta aqui .

Não tenho experiência com o mod_sed, mas o doc afirma:

mod_sed can be used as an input or output filter. mod_sed is a content filter, which means that it cannot be used to modify client or server http headers.

mod_headers podem ser mais adequados para o que você deseja fazer.

    
por 22.12.2014 / 14:49