我想要搜索包含匹配项的行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
不起作用。有什么方法可以只添加注释符号而不替换段落吗?
我想要脚本做的事情是:
- 搜索段落
- 附加
- 追加 --> 到末尾
编辑:这是我试图操纵的段落:
<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。