Как вставить строку в файл между двумя блоками известных строк (если они еще не вставлены ранее), используя bash? - PullRequest
5 голосов
/ 23 января 2012

Я написал скрипт bash, который может изменять php.ini в соответствии с моими потребностями.
Теперь мне нужно внести новое изменение, и я не могу найти для него ясного решения.

Мне нужноизмените php.ini, чтобы вставить (если он еще не вставлен ранее)

extension="memcache.so" 


между блоком

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

и блоком

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

возможно, прямо перед вторым.
Может кто-нибудь помочь мне, пожалуйста?Заранее спасибо

РЕДАКТИРОВАНИЕ: решено с помощью

if ! grep -Fxq 'extension="memcache.so"' 'php.ini'; then
    line=$(cat 'php.ini' | grep -n '; Module Settings ;' | grep -o '^[0-9]*')
    line=$((line - 2))
    sudo sed -i ${line}'i\extension="memcache.so"' 'php.ini'
fi

Ответы [ 3 ]

6 голосов
/ 23 января 2012

Получить номер строки, используя grep -n:

line=$(cat php.ini | grep -n 'Module Settings' | grep -o '^[0-9]*')

Вычислить строку для вставки текста:

line=$((line - 3))

Вставить его с помощью sed или awk.Примеры вставки «новой строки» в строке 45:

sed '45i\newline' file
awk 'NR==45{print "newline"}1'
4 голосов
/ 23 января 2012

Это может работать для вас:

 sed '/^; Dynamic Extensions ;$/,/^; Module Settings ;$/{H;//{x;/extension="memcache.so"/{p;d};/;;;\n/{s//&extension="memcache.so"\n/p}};d}' file

Это вставит extension="memcache.so" между ; Dynamic Extensions ; и ; Module Settings ;, если extension="memcache.so" уже присутствует.

2 голосов
/ 23 января 2012

Вы можете использовать следующий скрипт sed:

/^;\+$/{
N
/^;\+\n; Module Settings ;$/i extension="memcache.so"
}

В основном это соответствует этим строкам:

;;;;;;;;;;;;;;;;;;;
; Module Settings ;

и вставляет перед ними нужную строку (extension="memcache.so")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...