2009-08-13 5 views
1

Ich versuche ein Shell-Skript zu schreiben, das beim Start eine Suche durchführt und innerhalb einer Konfigurationsdatei ersetzt.Wie suchen und ersetzen Sie Text in einer Datei von einem Shell-Skript?

Die Zeichenfolge wir ersetzen möchten, ist:

include /etc/nginx/https.include; 

und wir wollen es mit einer kommentierten Version ersetzen:

#include /etc/nginx/https.include; 

Die Datei, die die Zeichenfolge, die wir ersetzen möchten enthält ist:

Ich bin kein Linux-Guru und kann nicht den Befehl finden, dies zu tun.

+0

Dies ist wirklich besser geeignet für serverfault.com, imho. –

+0

Ich sehe nicht, warum es für Serverfault geeignet ist.Es scheint nichts mit Servern zu tun zu haben. Es gehört auf Superuser. Wählen, um als solche zu schließen. – rmeador

+0

/bin/sh oder bash oder csh oder eine andere Shell sind Turing vollständige Sprachen. Warum denkst du nicht "Wie erreiche ich X in der Sprache Y?" gehört zu StackOverflow? – dmckee

Antwort

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

Wenn die Zeile möglicherweise nicht in der ; beenden, verwenden Sie stattdessen:

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

Wenn Sie die ursprüngliche Datei beibehalten möchten, fügen Sie eine Backup-Erweiterung nach -i:

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

Jetzt erklären. Die -p Flagge bedeutet Ersetzen in-Place. Alle Zeilen der Datei werden dem Ausdruck zugeführt, und das Ergebnis wird als Ersatz verwendet. Das Flag -i zeigt die Erweiterung der Sicherungsdatei an. Wenn Sie es ohne irgendetwas verwenden, verhindern Sie das Generieren von Backups. Die -e weist Perl an, den folgenden Parameter als einen auszuführenden Ausdruck zu erhalten.

Jetzt ist der Ausdruck s%something%other%. Ich benutze % anstelle der traditionellen / zu vermeiden, die Schrägstriche des Pfades zu entkommen. Ich verwende Klammern im Ausdruck und $1 im substituierten Ausdruck für die Sicherheit - wenn Sie einen ändern, wird der andere folgen. Somit ist %#$1% tatsächlich das zweite % von s, gefolgt von dem gewünschten , $1, das das Muster innerhalb der Klammer angibt, und dem letzten % von s.

HTH. HAND.

+0

+1 für die Lösung und für die Verwendung eines anderen besseren Zeichens für diesen Fall (%) anstelle der traditionelleren / –

2

Check out sed:

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

-i Mittel tun, um die Substitution an Ort und Stelle und -r bedeutet erweiterte reguläre Ausdrücke zu verwenden.

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

Dieses Skript shold Zeichenfolge ABCD zu DCBA in allen Dateien in Pfadname

3

sed -i 's/foo/bar/g' config.txt

Dies ersetzt ersetzen alle Instanzen von foo (case insensitive) mit Balken in der Datei config.txt

Verwandte Themen