Я хочу найти строку, содержащую log4j
и взять 7 строк до и 3 строки после совпадения.
grep -B7 -A3 "log4j" web.xml
blockquote>После этого я хочу добавить теги комментариев перед этим абзацем и после него.
<!-- paragraph that i found by grep -->
Я написал этот скрипт ниже:
search=`find . -name 'web.xml'` text=`grep -B7 -A3 "log4j" $search` sed -i "/$text/c $newparagraph" $search
Это не работает. Можно ли просто добавить символ комментария, а не заменить абзац?
Что я хочу сделать в сценарии:
- поиск абзаца
- append [ 116]
- добавить -> в конце
Редактировать : этот абзац пытается манипулировать:
<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> -->
Это было бы лучше сделать с библиотекой 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 .