无法将命令行参数传递给 bash 脚本中嵌入的 awk 脚本

Not able to pass commandline parameters to awk script embedded in bash script

我正在使用以下脚本尝试使用 awk 搜索和替换多行模式。 awk 脚本在直接使用时工作正常,但在尝试通过传递命令行参数通过 bash 脚本实现功能时,参数没有按预期放入 awk 中并产生不良结果。我用来测试 awk 脚本的示例文件和预期结果如下:

文件:

<A>
<B>
Port id=X
<C>
Port id=hey
Port no=hi
</C>
</B>
Port id=Z
</A>

现在,如果我想用 Network' 替换 'Port',但只在范围内..,我会简单地 运行 如下所示的 awk,这样就可以了:

awk '/<A>/,/<C>/ {gsub(/Port/,"Network"); } {print;}' filename

输出:

<A>
<B>
Network id=X
<C>
Port id=hey
Port no=hi
</C>
</B>
Port id=Z
</A>

我正在尝试通过编写如下脚本来使功能通用,该脚本将文件名、范围、要替换的模式和要放置的模式作为命令行参数并在 awk 脚本中使用它们,但是它不起作用。

任何人都可以帮助如何将命令行参数传递给 awk 脚本以实现我可以通过直接执行 awk 脚本来实现的功能?

#!/bin/bash

echo "Enter file-name ,scope to be matched separated with space , pattern to be replaced , pattern to be placed"
echo "The file name is : ,the scope to be matched :  -  , the pattern to be replaced is : , pattern to be placed is: "
echo "Scope Start : "
echo "Scope End : "

awk -v F= -v SS= -v SE= -v RE= -v TRE= '/"$SS"/,/"$SE"/ {gsub(/'"$TRE"'/,RE); } {print;}' ""

几件事:

  1. 在 awk 脚本中,$ 不用于扩展变量(与 shell 不同)。只需使用变量名。 $ 使其引用一个字段——例如,foo = 1; print $foo 将打印第一个字段 (</code>)。</li> <li>虽然您不能在 <code>// 标记内使用 awk 变量,但您可以匹配 ~ 变量中包含的正则表达式,如 [=18=] ~ some_variable 中一样。可以像往常一样指定范围。
  2. Shell 变量应该几乎总是被引用,将它们传递给 awk 的 -v 选项也不例外。

因此,将所有内容放在一起,您可以这样做:

awk -v SS="" -v SE="" -v TRE="" -v RE="" '[=10=] ~ SS,[=10=] ~ SE { gsub(TRE, RE) } { print }' ""

awk代码在哪里

[=11=] ~ SS, [=11=] ~ SE {  # between lines that match SS and SE,
  gsub(TRE, RE)     # replace stuff that matches TRE with RE
}
{ print }           # and print everything.