mod_sed - apache+sed - 反斜杠问题

mod_sed - apache+sed - 反斜杠问题

我刚刚开始使用 sed,在从 Apache mod_seq 使用 sed 时遇到了问题。任务是将 Web 服务帖子更改为文件上传帖子。已使用 mod_headers 更改了 Content-Type,此处的任务是更改请求正文。

请求正文:

<soapenv:信封 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:信封>



1)在命令提示符下使用 sed 进行 ok 测试:

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

输出与预期一致,带有换行符:

--AaB03x
内容处置:表单数据;名称=“xmlfile”;文件名=“myfile.xml”
内容类型:text/xml

<soapenv:信封 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:信封>
--AaB03x--


2)使用 Apache mod_sed 进行 Sed 调用:

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

当请求进入我的 Web 应用程序时,mod_sed 的输出。请注意,“n”而不是换行符。

--AaB03xnContent-disposition:表单数据;名称=“xmlfile”;文件名=“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>星期一</ns:test></soapenv:Body></soapenv:Envelope>n--AaB03x--n


我尝试使用 '' 和 "" i InputSed 命令。并尝试在控制字符 (\r 和 \n) 前使用 1、2、3 和 4 个退格键。看起来 Apache 或 mod_sed 忽略了反斜杠字符。

有人知道 mod_sed 和反斜杠是否存在一些特殊问题吗?

答案1

在 Ubuntu Apache/2.4.18 上测试了丑陋的解决方法,使用 sed 支持的子集:

$ cat tmp
第3行
$ sed "h;s/.*/line1/;p;s/.*/line2/;G;p;s/.*/line4/" tmp
第 1 行
第2行
第3行
第4行
$猫周
星期日
周三
星期五
$ sed "2{h;s/.*/monday/;p;s/.*/tuesday/;G;p;s/.*/thursday/;n;p;s/.*/saturday/;}" 周
星期日
周一
周二
周三
周四
星期五
周六
这些也有效,因为 \n 在搜索字符串中仍然可以被识别
“G;H;g;s/\n/line1&line2&/;s/\n$/&line4/”
“2{G;H;g;s/\n/星期一&星期二&/;s/\n$/&星期四/;n;p;s/.*/星期六/;}”
$ #sudo a2enmod sed
$ #apache2.conf
<位置 /txt/>
    添加输出过滤器 Sed txt
    OutputSed "G;H;g;s/\n/line1&line2&/;s/\n$/&line4/"
</位置>
$ 服务 apache2 重新加载
$ wget 本地主机/txt/tmp.txt -qO -
第 1 行
第2行
第3行
第4行
$#sudo a2enmod ext_filter
$ #apache2.conf
ExtFilterDefine external_sed 模式=输出 intype=text/plain cmd="/bin/sed:0;N;$!b0;s/\\n//g"
<位置 /txt/>
    设置输出过滤器 external_sed
</位置>
$ 服务 apache2 重新加载
$ wget localhost/txt/week.txt -qO -
周日周三周五

也可以看看:#1#2

答案2

如果您想用多行文本替换单行文本,您可以尝试以下答案这里

我没有使用过 mod_sed,但是文档状态:

mod_sed 可用作输入或输出过滤器。mod_sed 是一个内容过滤器,这意味着它不能用于修改客户端或服务器 http 标头。

mod_headers 可能更适合你想要做的事情。

相关内容