SED复杂的字符串(单引号和双引号及/空间...)[复制]

问题描述 投票:1回答:2

这个问题已经在这里有一个答案:

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

我不得不更换原始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"/>

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

string sed replace quotes
2个回答
1
投票

丹D.是正确的。使用正则表达式操作XML是一个邪恶的黑客,在某些情况下工作,但它可以迅速成为一个维持性的噩梦。不过,如果你真的相信,因为某些原因(如没有XML解析器availabel),你只需要使用SED该任务,我可以回答你的问题(引用另一个SO问题)。

你需要逃避的文件中的字符串。在这种情况下,麻烦源于替换字符串中的字符&这意味着把整个比赛在这里。见Escape a string for a sed replace pattern关于如何逃脱的搜索和替换模式的建议。


0
投票

我得到了解决

正如迈克尔·提,什么问题是和,于是我躲过了和两个文本变量,(国防部和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

最后创建一个shell脚本,使变化与sed的:(用#代替/和“”,而不是它是非常重要的“”)

#!/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 
© www.soinside.com 2019 - 2024. All rights reserved.