我刚刚开始使用 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 - 周日周三周五