Macos 如何用多行替换word

Macos 如何用多行替换word,macos,sed,awk,Macos,Sed,Awk,我看过很多类似的问题和答案,但都遇到了麻烦 我有一个XML文件,其行如下: <blah:formProperty id="_blah" default="%HTML%"> &lt;style&gt; blah &lt;/style&gt; &lt;script&gt; blah &lt;/script&gt; 使用sed会引发错误,因为它不喜欢多行 awk似乎是一个更好的选择,但不知道如何完成它 很接近,但我无法让a

我看过很多类似的问题和答案,但都遇到了麻烦

我有一个XML文件,其行如下:

<blah:formProperty id="_blah" default="%HTML%">
&lt;style&gt;
blah
&lt;/style&gt;
&lt;script&gt;
blah
&lt;/script&gt;
使用sed会引发错误,因为它不喜欢多行

awk似乎是一个更好的选择,但不知道如何完成它

很接近,但我无法让awk示例工作。$DATA是如何定义的,以便“echo$DATA”返回多行?很多论坛的话题都是这样的,而且都是这样说的

echo "$DATA" 
将打印多行

这是一个由两部分组成的问题。如何解决上述问题?他们是如何让awk的例子起作用的

$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 
现在,您一定想知道,为什么要替换
%HTML%
。这是因为有一个特殊的字符
&
,它告诉
sub
函数生成匹配的文本,在我们的例子中是
%HTML%
。为了避免这种情况,你需要逃避它。使用
\\
将允许
sub
放入文本
&
。使用
\&
被视为普通的
&
,您也不希望这样

$ DATA='\\&lt;style\\&gt;
blah
\\&lt;/style\\&gt;
\\&lt;script\\&gt;
blah
\\&lt;/script\\&gt;'
更新: 正如OP所说,他在OSX上使用了一个
awk
,它不接受带有内嵌换行符的变量,并按照评论中的建议更新答案

awk -v var="${DATA//$'\n'/\\n}" '{sub(/%HTML%/,var)}1' file.xml 
$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 
现在,您一定想知道,为什么要替换
%HTML%
。这是因为有一个特殊的字符
&
,它告诉
sub
函数生成匹配的文本,在我们的例子中是
%HTML%
。为了避免这种情况,你需要逃避它。使用
\\
将允许
sub
放入文本
&
。使用
\&
被视为普通的
&
,您也不希望这样

$ DATA='\\&lt;style\\&gt;
blah
\\&lt;/style\\&gt;
\\&lt;script\\&gt;
blah
\\&lt;/script\\&gt;'
更新: 正如OP所说,他在OSX上使用了一个
awk
,它不接受带有内嵌换行符的变量,并按照评论中的建议更新答案

awk -v var="${DATA//$'\n'/\\n}" '{sub(/%HTML%/,var)}1' file.xml 
$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 
现在,您一定想知道,为什么要替换
%HTML%
。这是因为有一个特殊的字符
&
,它告诉
sub
函数生成匹配的文本,在我们的例子中是
%HTML%
。为了避免这种情况,你需要逃避它。使用
\\
将允许
sub
放入文本
&
。使用
\&
被视为普通的
&
,您也不希望这样

$ DATA='\\&lt;style\\&gt;
blah
\\&lt;/style\\&gt;
\\&lt;script\\&gt;
blah
\\&lt;/script\\&gt;'
更新: 正如OP所说,他在OSX上使用了一个
awk
,它不接受带有内嵌换行符的变量,并按照评论中的建议更新答案

awk -v var="${DATA//$'\n'/\\n}" '{sub(/%HTML%/,var)}1' file.xml 
$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 
现在,您一定想知道,为什么要替换
%HTML%
。这是因为有一个特殊的字符
&
,它告诉
sub
函数生成匹配的文本,在我们的例子中是
%HTML%
。为了避免这种情况,你需要逃避它。使用
\\
将允许
sub
放入文本
&
。使用
\&
被视为普通的
&
,您也不希望这样

$ DATA='\\&lt;style\\&gt;
blah
\\&lt;/style\\&gt;
\\&lt;script\\&gt;
blah
\\&lt;/script\\&gt;'
更新: 正如OP所说,他在OSX上使用了一个
awk
,它不接受带有内嵌换行符的变量,并按照评论中的建议更新答案

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

如果数据中有多行,则
echo“$DATA”
将打印多行!请尝试
DATA=“$(printf“multi\nline\nda\n”)”
您在哪个平台上?并非所有的
awk
s都是相同的。我在Mac电脑上。我上面给出的链接有echo$DATA,然后显示了多行输出,但却无法重新创建。@PaulEricson可能是打字错误,因为当您打印不带引号的字符串时,换行符会转换为空格。如果数据中有多行,则
echo“$DATA”
将打印多行!请尝试
DATA=“$(printf“multi\nline\nda\n”)”
您在哪个平台上?并非所有的
awk
s都是相同的。我在Mac电脑上。我上面给出的链接有echo$DATA,然后显示了多行输出,但却无法重新创建。@PaulEricson可能是打字错误,因为当您打印不带引号的字符串时,换行符会转换为空格。如果数据中有多行,则
echo“$DATA”
将打印多行!请尝试
DATA=“$(printf“multi\nline\nda\n”)”
您在哪个平台上?并非所有的
awk
s都是相同的。我在Mac电脑上。我上面给出的链接包含echo$数据,然后显示