【问题标题】:sed complex string (single and double quotes & / space...) [duplicate]sed 复杂字符串(单引号和双引号 & / 空格...)[重复]
【发布时间】:2026-01-10 00:25:01
【问题描述】:

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

我要替换原来的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"/>

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

【问题讨论】:

  • 没有。不要在 XML 上使用正则表达式。使用 XML 解析器,然后根据需要替换节点属性。或者,您可以使用 XSLT,让我们编写一个树形转换器。

标签: string sed replace quotes


【解决方案1】:

Dan D. 是对的。使用正则表达式操作 XML 是一种邪恶的 hack,在某些情况下有效,但它很快就会成为维护的噩梦。不过,如果您真的确信由于某些原因(例如没有可用的 XML 解析器)您只是 必须 使用 sed 来完成该任务,我会为您的问题提供答案(参考另一个 SO 问题)。

您需要转义文件中的字符串。在这种情况下,问题在于替换字符串中的字符&amp;,这意味着将整个匹配项放在此处。请参阅Escape a string for a sed replace pattern 以获取有关如何转义搜索和替换模式的建议。

【讨论】:

  • 非常感谢你,我会看到转义“&”,如果我找到解决方案,我会在这里发布。
【解决方案2】:

我找到了解决方案

正如 Michael 提到的,问题是 &,所以我在两个文本变量(MOD 和 XML)中转义了 &

这是我的结果,(如果您发现 sed 中的正则表达式有问题,例如 /、""、&、试试这个

首先,我创建两个文本,一个是我要替换的 xml 字符串 (xml),另一个是我要替换的 xml 字符串 (mod)

这里有两个文本:

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(带 & 转义:\&

<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 来模拟我想在之后工作的完整 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

最后创建一个使用 sed 进行更改的 shell 脚本:(使用 # 代替 / 和 " " 代替 ' ' 非常重要)

#!/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 

【讨论】:

    最近更新 更多