使用 grep 处理文本时出现问题

使用 grep 处理文本时出现问题

我想要搜索包含匹配项的行log4j并取其前 7 行和后 3 行。

grep -B7 -A3 "log4j" web.xml

之后我想在此段落之前和之后添加注释标签。

<!--
paragraph that i found by grep
-->

我写了下面的脚本:

search=`find . -name 'web.xml'`
text=`grep -B7 -A3 "log4j" $search`
sed -i "/$text/c $newparagraph" $search

不起作用。有什么方法可以只添加注释符号而不替换段落吗?

我想要脚本做的事情是:

  1. 搜索段落
  2. 附加
  3. 追加 --> 到末尾

编辑:这是我试图操纵的段落:

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>

<listener>
    <listenerclass>
        org.springframework.web.util.Log4jConfigListener
    </listener-class>
</listener>

此段落是许多段落的一部分!我想将其改为:

<!--
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>

<listener>
    <listenerclass>
        org.springframework.web.util.Log4jConfigListener
    </listener-class>
</listener>
-->

答案1

使用 XML 库可以更好地完成此操作,但是这里是在 sed 中...

Sed 有用于插入和附加行的i命令a。我认为以下脚本会有所帮助。

sed -n '/log4jConfigLocation/=' < test.test |\
while read index; do
    sed -i $search -e "$((index-1)) i\ <\!--" -e "$((index+8)) a\ -->" < $search
done

第一部分,`sed -n '/log4jConfigLocation/=' 将获取包含 'log4jConfigLocation' 的行号。下一部分在两个命令中使用这些行号:在上方 1 行处插入一行,在下方 8 行处附加一行。

有一种更好的方法是使用 sed 的保留缓冲区,但我对它不太熟悉;如果你有兴趣,你可以看看本指南。不过,如果你要定期处理这类事情,你应该看看XMLStarlet

相关内容