用sed替换两个模式之间的多行字符串

时间:2016-06-29 20:36:03

标签: xml shell

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

1300_character_long_string_here

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

这是我目前在该命令中更成功的尝试之一:

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

虽然这不起作用,但如果我尝试仅替换第一个标记,我可以看到它正在替换。

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

2 个答案:

答案 0 :(得分:1)

您可以使用r命令从文件中插入替换文本:

sed '
/<Tag>.*<\/Tag>/{
r newcontentfile
d
}
' file

并且不要忘记用于word boundaries的代码中的<>。它可以解释为什么你的模式不匹配。

答案 1 :(得分:0)

我建议这样的事情:

File1 包含替换文字,例如

some other string

File2 包含标记的行:

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

现在,您可以说:

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

如何工作:首先,读取替换文件,将其单行放在保留空间中,然后将其从输出流中删除。接下来,如果一行与<tag>匹配,则从保留空间中检索替换文本,然后添加标记。