2009-08-13 2 views
1

Я пытаюсь написать сценарий оболочки, который выполняет поиск и заменяет внутри файла конфигурации при запуске.Как искать и заменять текст в файле из сценария оболочки?

Строки мы пытаемся заменить это:

include /etc/nginx/https.include; 

и мы хотим заменить его комментировали версию:

#include /etc/nginx/https.include; 

Файл, который содержит строку, которую мы хотим заменить is:

/etc/nginx/app-servers.include 

Я не являюсь гуру Linux и не могу найти команду для этого.

+0

Это действительно более подходит для serverfault.com, imho. –

+0

Я не понимаю, почему он подходит для serverfault.Кажется, он не имеет ничего общего с серверами. Он принадлежит суперпользователю. Голосование, чтобы закрыть как таковое. – rmeador

+0

/bin/sh или bash или csh или любая другая оболочка - это полные языки Turing. Почему вы не думаете, что «Как достичь X в языке Y?» принадлежит StackOverflow? – dmckee

ответ

7
perl -p -i -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

Если линия не может закончиться в ;, используйте вместо этого:

perl -p -i -e 's%^(include /etc/nginx/https.include;.*)$%#$1%' /etc/nginx/ap-servers.include 

Если вы хотите сохранить исходный файл, добавить резервное расширение после -i:

perl -p -i.bak -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

Теперь, объясняя. Флаг -p означает замену на месте. Все строки файла будут переданы в выражение, и результат будет использоваться в качестве замены. Флаг -i указывает расширение файла резервной копии. Используя это без каких-либо проблем, вы предотвращаете создание резервных копий. -e сообщает Perl, чтобы получить следующий параметр в качестве выполняемого выражения.

Теперь выражение s%something%other%. Я использую % вместо более традиционных /, чтобы избежать необходимости сбрасывать дорожки. Я использую скобки в выражении и $1 в замещенном выражении для безопасности - если вы измените одно, другое будет следовать. Таким образом, %#$1% фактически является вторым %s, за которым следует желаемый #, $1, указывающий узор внутри скобок, и последний % от s.

HTH. РУКА.

+0

+1 для решения и для использования другого лучшего символа для этого случая (%) вместо более традиционного / –

2

Заканчивать sed:

sed -i -r 's|^(include /etc/nginx/https.include;)$|#\1|' /etc/nginx/app-servers.include 

-i означает сделать замену в место и -r означает использовать расширенные регулярные выражения.

0
cd pathname 
for y in `ls *`; 
do sed "s/ABCD/DCBA/g" $y > temp; mv temp $y; 
done 

Этот скрипт shold заменить строку ABCD на ДХБС во всех файлах в путевом имени

3

'/ Foo/бар с/г' SED -i config.txt

Это заменяет все экземпляры foo (без учета регистра) с баром в файле config.txt

Смежные вопросы