提问人:facyssys 提问时间:2/3/2019 更新时间:2/4/2019 访问量:230
sed 复数字符串(单引号和双引号 & / 空格...)[复制]
sed complex string (single and double quotes & / space...) [duplicate]
问:
Hollo,我研究了很多,但从未找到适合我需要的解决方案。
我必须替换原来的xml行:
<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>
使用修改后的 XML 行:
<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>
我尝试制作 2 个变量。这是我的脚本:
#!/bin/bash
MOD=`more /aplicaciones/users/t682213/alvaro/mod`
XML=`more /aplicaciones/users/t682213/alvaro/xml`
sed "s#$XML#$MOD#g" test2
但是我得到了这样重复的东西:
/aplicaciones/users/t682213/alvaro$ sed "s#$XML#$MOD#g" test2
<access-log pattern="%h %l %u %t <access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot;%r<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot; %s %b <access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot;%{i,Referer}<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot; <access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot;%{i,User-Agent}<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>
请我需要帮助,我想用另一个非常复杂的字符串替换一个非常复杂的字符串。
答:
1赞
Michael Karcher
2/3/2019
#1
Dan D. 是对的。使用正则表达式操作 XML 是一种邪恶的黑客攻击,在某些情况下会起作用,但它很快就会成为维护的噩梦。然而,如果你真的有信心,由于某些原因(比如没有XML解析器),你只需要使用sed来完成该任务,我会为你的问题提供答案(参考另一个SO问题)。
您需要对文件中的字符串进行转义。在这种情况下,问题来自替换字符串中的字符,这意味着将整个匹配项放在这里。有关如何转义搜索和替换模式的建议,请参阅对 sed 替换模式的字符串进行转义。&
评论
0赞
facyssys
2/3/2019
非常感谢,我会看到“&”的分层,如果我找到解决方案,我会在这里发布。
0赞
facyssys
2/4/2019
#2
我得到了解决方案
正如Michael所提到的,问题出在&,所以我在两个文本变量(MOD和XML)中转义了&
这是我的结果,(如果您在 SED 中发现正则表达式存在问题,例如 /、“”和 ,请尝试一下)
首先,我创建两个文本,一个用于要替换的 XML 字符串 (XML),另一个文本用于要替换为 (mod) 的 XML 字符串
以下是两篇文章:
xml(带 & 转义:\&)
<access-log pattern="%h %l %u %t \"%r\" %s %b \"%{i,Referer}\" \"%{i,User-Agent}\" %T " prefix="access_${jboss.server.name}" suffix=".log"/>
mod (带 & escape:\&)
<access-log pattern="%h %l %u %t \"%r\" %s %b \"%{i,Referer}\" \"%{i,User-Agent}\" %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>
我创建了一个测试 TXT 来模拟 de 完整的 XML 我想在之后工作的地方,称为 test2
<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T " prefix="access_${jboss.server.name}" suffix=".log"/>
HOLA
ADIOS
最后创建一个 shell 脚本,使用 sed 进行更改:(它非常 import,并且使用 # 代替 / 和 “ ” 代替 ' ' )
#!/bin/bash
MOD=`more /aplicaciones/users/t682213/alvaro/mod`
XML=`more /aplicaciones/users/t682213/alvaro/xml`
sed "s#$XML#$MOD#" test2 >> test3
最后,脚本会生成一个正确修改的 test3 文本:
<access-log pattern="%h %l %u %t "%r" %s %b "%{i,Referer}" "%{i,User-Agent}" %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>
HOLA
ADIOS
评论