匹配模式,如果找到模式,则根据行号注释标签

匹配模式,如果找到模式,则根据行号注释标签

我的输入 XML 文件如下所示

输入 XML 文件

<Formula>
<Name>Total Hate Fee</Name>
<Code>1234>
<Job>BO</Job>
<Type>sub</Type>
</Formula>


<Formula>
<Name>Total BO Fee</Name>
<Code>1234>
<Job>BO</Job>
<Type>sub</Type>
</Formula>


<Formula>
<Name>Total BO Fee</Name>
<Code>1234>
<Job>BO</Job>
<Type>sub</Type>
</Formula>

我希望我的 shell 脚本搜索模式“Total Hate Fee”,如果找到该模式,那么我想评论该特定行添加<!---->仅在模式匹配处,以便我的输出如下所示

输出 XML 文件

<Formula>
<--<Name>Total Hate Fee</Name>-->
<Code>1234>
<Job>BO</Job>
<Type>sub</Type>
</Formula>


<Formula>
<Name>Total BO Fee</Name>
<Code>1234>
<Job>BO</Job>
<Type>sub</Type>
</Formula>


<Formula>
<Name>Total BO Fee</Name>
<Code>1234>
<Job>BO</Job>
<Type>sub</Type>
</Formula>

谁能帮我解决这个问题吗?请注意,我不想使用xmlstartet工具。相反,我想使用 shell 脚本

答案1

你就快到了。我刚刚添加了第二行 ed 代码,它看起来比匹配行低 4 行。

printf '%s\n' \
    'g/Total Hate Fee/-1 s/^/<!--/' \
    'g/Total Hate Fee/+4 s/$/-->/' \
    'w newfile.xml' 'q' \
| ed -s file.xml;

答案2

awk -v pattern="$yourMatch" '
    $0 ~ pattern{ $0= "<!--" $0 "-->" }1' infile

请注意,在上面pattern,将作为正则表达式与$0我们使用的进行匹配;要用作pattern字符串,请按以下方式使用:

awk -v string="$yourMatch" '
    { if(index($0, string)) $0= "<!--" $0 "-->" }1' infile

相关内容