我看过很多类似的问题和答案,但是碰到了一堵砖墙。
我有一个XML文件,其中包含以下行:
<blah:formProperty id="_blah" default="%HTML%">
我需要将%HTML%替换为大约200多行,如下所示:
<style>
blah
</style>
<script>
blah
</script>
使用sed会抛出错误,因为它不喜欢多行。
awk似乎是一个更好的选择,但无法弄清楚如何完成它。Replace a word with multiple lines using sed?已接近,但我无法获得awk示例。如何定义$ DATA以使'echo $ DATA'返回多行?关于这一点的论坛主题并且所有人都说只有
echo "$DATA"
将打印多行。
所以这真是一个2部分的问题。我如何解决上面的问题?他们是如何让这个awk的例子起作用的呢?
答案 0 :(得分:3)
如何定义$ DATA以使'echo $ DATA'返回多行?
引用您的多行文字。例如:
$ DATA='<style>
blah
</style>
<script>
blah
</script>'
现在,如果您echo
变量,您将获得
$ echo "$DATA"
<style>
blah
</style>
<script>
blah
</script>
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='\\<style\\>
blah
\\</style\\>
\\<script\\>
blah
\\</script\\>'
$ awk -v var="$DATA" '{sub(/%HTML%/,var)}1' file.xml
h:formProperty id="_blah" default="<style>
blah
</style>
<script>
blah
</script>”>
正如OP所说,他在OSX上使用了awk
,它不接受带有嵌入换行符的变量,在评论中按照mklement0的建议更新答案。
awk -v var="${DATA//$'\n'/\\n}" '{sub(/%HTML%/,var)}1' file.xml