2016-06-29 136 views
0

我有一个文件在xml标签之间保存一长的单行字符串,我想用sed替换标记之间的内容。用sed替换两个模式之间的多行字符串

1300_character_long_string_here

我遇到的问题是,sed的,尽管我知道我的正则表达式正确选择不是取代。这就是说,即使我能够正确选择和替换,我也不知道如何从文件中取出替换字符串(大致相当长)并放置它。

下面是在命令我更成功当前的尝试之一:

sed 's/\<Tag\>(.*)\<\/Tag\>/REPLACE/g' test.txt> out.txt 

虽然这并不工作,我可以看到,如果我试图只替换第一个标记是正取代。

我应该在开始时提到这是一个AIX系统,而不是GNU系统。

+1

您是否尝试过##(。*)\ <\/Tag\>#REPLACE#g''? – Beta

+0

搜索'替换多行字符串[sed]'返回14 Q/A。你看过这些答案吗?你几乎肯定会找到一些好的建议。祝你好运。 – shellter

+0

正则表达式不适合修改xml文件 – hek2mgl

回答

0

我建议是这样的:

文件1包含替换文本,例如

some other string 

文件2包含标记线:

... 
<tag>some string</tag> 
... 

现在,你可以说:

sed '1{h;d}; /<tag>/{x;s/^/<tag>/;s/$/<\/tag>/}' File1 File2 

如何工作的:首先,阅读替换文件,将其单线在保留空间并从输出流中删除它。接下来,如果某行匹配<tag>,则从保留空间中检索替换文本,并添加标签。

1

您可以从与r命令文件中插入您的置换文本:

而且因为它是用于word boundaries不要逃避你的标签<>。这可以解释为什么你的模式不匹配。

+0

对。 @KeigaTide你已经知道转义对每个角色有什么影响。当你转义元字符(例如'*')时,它会变成文字,但是当你在一些seds中转义**一些**文字字符时,它们变成元字符(例如'+'或者在这种情况下'<' and '>'成为词边界在GNU sed中)。如果您不确定,那么使用'[]'封装一个字符(例如'[<]')以确保您将元字符转换为文字(如果需要但不会意外将文字转换为元字符)。 –

+0

@Kenavoz正如我写的我的sed版本无法解析您的解决方案,我会捅它。 词边界是我不知道的东西,谢谢。这说删除转义字符导致正则表达式来选择整个字符串。 – KeigaTide

+0

@KeigaTide您的模式中的'('和')'必须用于反向引用(您必须在基本正则表达式模式中将其转义为\('和'\)')。它不仅仅匹配''的内容,而是整个字符串。 – SLePort

相关问题