如何用多行替换单词

时间:2014-02-13 01:15:28

标签: macos sed awk

我看过很多类似的问题和答案,但是碰到了一堵砖墙。

我有一个XML文件,其中包含以下行:

<blah:formProperty id="_blah" default="%HTML%">

我需要将%HTML%替换为大约200多行,如下所示:

&lt;style&gt;
blah
&lt;/style&gt;
&lt;script&gt;
blah
&lt;/script&gt;

使用sed会抛出错误,因为它不喜欢多行。

awk似乎是一个更好的选择,但无法弄清楚如何完成它。

Replace a word with multiple lines using sed?已接近,但我无法获得awk示例。如何定义$ DATA以使'echo $ DATA'返回多行?关于这一点的论坛主题并且所有人都说只有

echo "$DATA" 

将打印多行。

所以这真是一个2部分的问题。我如何解决上面的问题?他们是如何让这个awk的例子起作用的呢?

1 个答案:

答案 0 :(得分:3)

  

如何定义$ DATA以使'echo $ DATA'返回多行?

引用您的多行文字。例如:

$ DATA='&lt;style&gt;
blah
&lt;/style&gt;
&lt;script&gt;
blah
&lt;/script&gt;'

现在,如果您echo变量,您将获得

$ echo "$DATA"
&lt;style&gt;
blah
&lt;/style&gt;
&lt;script&gt;
blah
&lt;/script&gt;
  awk似乎是一个更好的选择,但无法弄清楚如何完成它。

现在您已定义了变量,您可以通过执行以下操作在awk中使用该变量:

awk -v var="$DATA" '{sub(/%HTML%/,var)}1' file.xml 

$ cat file.xml 
h:formProperty id="_blah" default="%HTML%">

$ awk -v var="$DATA" '{sub(/%HTML%/,var)}1' file.xml 
h:formProperty id="_blah" default="%HTML%lt;style%HTML%gt;
blah
%HTML%lt;/style%HTML%gt;
%HTML%lt;script%HTML%gt;
blah
%HTML%lt;/script%HTML%gt;">

现在你一定想知道为什么在替换中得到%HTML%。这是因为有一个特殊字符&告诉sub函数生成匹配的文本,在我们的例子中是%HTML%。为了避免这种情况,你需要逃避它。使用\\将允许sub放置文字&。使用\&被视为普通&,您也不需要。{/ p>

$ DATA='\\&lt;style\\&gt;
blah
\\&lt;/style\\&gt;
\\&lt;script\\&gt;
blah
\\&lt;/script\\&gt;'

$ awk -v var="$DATA" '{sub(/%HTML%/,var)}1' file.xml 
h:formProperty id="_blah" default="&lt;style&gt;
blah
&lt;/style&gt;
&lt;script&gt;
blah
&lt;/script&gt;”>

更新

正如OP所说,他在OSX上使用了awk,它不接受带有嵌入换行符的变量,在评论中按照mklement0的建议更新答案。

awk -v var="${DATA//$'\n'/\\n}" '{sub(/%HTML%/,var)}1' file.xml