首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed复杂字符串(单引号和双引号&/空格...)

sed复杂字符串(单引号和双引号&/空格...)
EN

Stack Overflow用户
提问于 2019-02-03 03:10:18
回答 2查看 157关注 0票数 1

哈罗,我研究了很多,但从来没有找到一个适合我需要的解决方案。

我必须替换原始的xml行:

代码语言:javascript
复制
<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行:

代码语言:javascript
复制
<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"/>

我试着做两个变量。下面是我的脚本:

代码语言:javascript
复制
#!/bin/bash
MOD=`more /aplicaciones/users/t682213/alvaro/mod`
XML=`more /aplicaciones/users/t682213/alvaro/xml`
sed "s#$XML#$MOD#g" test2

但我得到的东西是这样的:

代码语言:javascript
复制
/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"/>

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

EN

回答 2

Stack Overflow用户

发布于 2019-02-03 03:20:02

丹·D是对的。使用正则表达式操作XML是一种邪恶的技巧,在某些情况下是可行的,但它很快就会成为维护人员的噩梦。然而,如果您确实确信由于某些原因(比如没有可用的XML解析器),您只能使用sed来完成该任务,我将为您的问题提供一个答案(参考另一个SO问题)。

您需要对文件中的字符串进行转义。在这种情况下,问题出现在替换字符串中的字符&,这意味着将整个匹配放在这里。有关如何避开搜索和替换模式的建议,请参阅Escape a string for a sed replace pattern

票数 1
EN

Stack Overflow用户

发布于 2019-02-04 00:03:34

我找到解决方案了

正如Michael提到的,问题出在&,所以我在两个文本变量( MOD和XML)中避开了&。

这是我的结果,(如果你在sed中发现正则表达式有问题,比如/,"",&,)

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

下面是两个文本:

转义xml(带有&:\&)

代码语言:javascript
复制
<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"/>

修改(使用转义:\&) (&E)

代码语言:javascript
复制
<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"/>

我创建了一个名为test2的测试txt来模拟我想在其中工作的完整xml。

代码语言:javascript
复制
<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脚本(使用#代替/和“”代替‘’非常重要)

代码语言:javascript
复制
#!/bin/bash
MOD=`more /aplicaciones/users/t682213/alvaro/mod`
XML=`more /aplicaciones/users/t682213/alvaro/xml`
sed "s#$XML#$MOD#" test2 >> test3 

最后,脚本生成一个经过正确修改的test3文本:

代码语言:javascript
复制
<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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54496574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档