sed 复数字符串(单引号和双引号 & / 空格...)[复制]

sed complex string (single and double quotes & / space...) [duplicate]

提问人:facyssys 提问时间:2/3/2019 更新时间:2/4/2019 访问量:230

问:

Hollo,我研究了很多,但从未找到适合我需要的解决方案。

我必须替换原来的xml行:

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>

使用修改后的 XML 行:

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %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 &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot;%r<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot; %s %b <access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot;%{i,Referer}<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot; <access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot;%{i,User-Agent}<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>

请我需要帮助,我想用另一个非常复杂的字符串替换一个非常复杂的字符串。

字符串 sed 替换 引号

评论

0赞 Dan D. 2/3/2019
不。不要在 XML 上使用正则表达式。使用 XML 解析器,然后根据需要替换 node 属性。或者你可以使用 XSLT,让我们写一个树传感器。

答:

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 \&quot;%r\&quot; %s %b \&quot;%{i,Referer}\&quot; \&quot;%{i,User-Agent}\&quot; %T " prefix="access_${jboss.server.name}" suffix=".log"/>

mod (带 & escape:\&)

<access-log pattern="%h %l %u %t \&quot;%r\&quot; %s %b \&quot;%{i,Referer}\&quot; \&quot;%{i,User-Agent}\&quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>

我创建了一个测试 TXT 来模拟 de 完整的 XML 我想在之后工作的地方,称为 test2

<access-log pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %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 &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; %T %{i,Proxy-Remote-User}" prefix="access_${jboss.server.name}" suffix=".log"/>
HOLA
ADIOS