无法将命令行参数传递给 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;}' ""
几件事:
- 在 awk 脚本中,
$
不用于扩展变量(与 shell 不同)。只需使用变量名。 $
使其引用一个字段——例如,foo = 1; print $foo
将打印第一个字段 (</code>)。</li>
<li>虽然您不能在 <code>//
标记内使用 awk 变量,但您可以匹配 ~
变量中包含的正则表达式,如 [=18=] ~ some_variable
中一样。可以像往常一样指定范围。
- 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.
我正在使用以下脚本尝试使用 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;}' ""
几件事:
- 在 awk 脚本中,
$
不用于扩展变量(与 shell 不同)。只需使用变量名。$
使其引用一个字段——例如,foo = 1; print $foo
将打印第一个字段 (</code>)。</li> <li>虽然您不能在 <code>//
标记内使用 awk 变量,但您可以匹配~
变量中包含的正则表达式,如[=18=] ~ some_variable
中一样。可以像往常一样指定范围。 - 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.