Text ersetzten per Bash-Skript

S

Sarajin

Grünschnabel
Hallo Board,

ich möchte in der smb.conf eine Zeile mit einer andere ersetzen.
aus
# passdb backend = ldapsam:"ldap://bar.foobar.org" ## LEAVE THIS COMMENTED OUT!

soll
passdb backend = ldapsam:"ldap://ldapmaster.foobar.org"

werden

ich hab mit sed rumprobiert und bekomme nur eine leere Datei zurück.
kann mir jemand sagen mit welchen befehlen ich das bewerkstelligen kann.

Danke im voraus
Sarajin
 
Zuletzt bearbeitet:
Das sollte mit sed schon gehen.
Was genau hast du probiert?
Leere Datei sieht nach dem Kardinalfehler <INPUT> = <OUTPUT> aus.

GNU sed kennt die Option -i.
 
Mein letzter Versuch sieht so aus:
"
FILE=/etc/samba/smb.conf
COMMENT='# passdb backend = ldapsam:"ldap://bar.foobar.org" ## LEAVE THIS COMMENTED OUT!'
UNCOMMENT='passdb backend = ldapsam:"ldap://bar.foobar.org"'

sed -i -e 's/$COMMENT/$UNCOMMENT/g' $FILE
"
Vorher hatte ich noch ein cat vorne mit einer pipe und somit den von dir vermuteten Fehler gebaut.
nun ist die datei zwar gefüllt aber unverändert?
 
also erstmal mußt du die # und / maskieren und dann durch geeignete Anführungszeichen die Variablensubstitution ermöglichen:
Code:
COMMENT='\# passdb backend = ldapsam:"ldap:\/\/bar.foobar.org" \#\# LEAVE THIS COMMENTED OUT!'
UNCOMMENT='passdb backend = ldapsam:"ldap:\/\/bar.foobar.org"'
sed -i -e "s/$COMMENT/$UNCOMMENT/" $FILE
dann klappts auch. das g nach der Substitution kannst du dir schenken.
bye,
yai
 
Danke das hat geholfen.

Nun hab ich noch eine andere Frage zu sed.

Ich möchte eine Mehrzeilige Stelle gegen eine andere mehrzeilige Stelle ersetzen, wie mach man das?

Bin beim BASH-Scripten noch anfänger, habt bitte rücksicht.

Danke für eure Antworten schon einmal im Vorraus.

Mein Versuch war sowas:
NSS='/etc/nsswitch.conf'
NSSORG='\# passwd: files nis\n
\# shadow:\ files nis\n
\# group:\ files nis\n
\n
passwd:\ compat\n
group:\ compat\n
\n
hosts:\ files mdns4_minimal [NOTFOUND=return] dns\n
networks:\ files dns\n'


NSSLDAP='passwd:\ files ldap\n
shadow:\ files ldap\n
group:\ files ldap\n
\n
hosts:\ files dns wins\n
networks:\ files dns\n'
sed -i -e "s/$NSSORG/$NSSLDAP/" $NSS

Aber das will garnicht?
 
Zuletzt bearbeitet:
Erstmal kann man das erste Problem imho eleganter mit backreference lösen:
Code:
echo '# passdb backend = ldapsam:"ldap://bar.foobar.org" ## LEAVE THIS COMMENTED OUT!'|sed 's/^# \(passdb.*\)/\1/'
Kannst natürlich in der Klammer beliebig spezifisch werden, um nicht jede Zeile mit "# passdb" zu substituieren.

Und das mit newlines ist nicht ganz so trivial. Dazu musst du die entsprechenden Zeilen in den Patternspace holen mit dem sed-Kommando "N":
Code:
echo -e 'foo\nbar\nbaz'|sed '/foo/{N;N;s/foo\nbar\nbaz/abc\ntest\n123/}'
 
Erstmal kann man das erste Problem imho eleganter mit backreference lösen:
Code:
echo '# passdb backend = ldapsam:"ldap://bar.foobar.org" ## LEAVE THIS COMMENTED OUT!'|sed 's/^# \(passdb.*\)/\1/'
Kannst natürlich in der Klammer beliebig spezifisch werden, um nicht jede Zeile mit "# passdb" zu substituieren.

Danke für die Antwort, hatte die email Benachritigung nicht an daher nicht bemerkt das doch eine Antwort kam, und eben erst mal wieder zu gekommen nachzuschauen.

Leider verstehe ich das erste Beispiel nicht so als das ich es benutzen könnte. Wie bekomme ich auf den weg den hinteren Kommentar gelöscht? Und warum ein ^ vor dem #. Steht bestimmt in der man page wenn man lange genug aufmerksam liest?! Aber ich bitte um eine Kommentierende Erklärung der Zeichenkette, das verstehe ich hoffentlich schneller als die manpage zu studieren.


Viel Dank für eure Hilfe
 
Das ^ ist Teil des Regulären Ausdrucks und besagt, dass das folgende Zeichen am Beginn der Zeile stehen muss.
\(foo bar\) besagt, dass die Zeichenkette foo bar mit der Backreferenz - hier in der ersten weil einzigen Klammer - im Ersetzungsteil als \1 referenziert wird.

Schau dir mal die regulären Ausdrücke von sed an, dann verstehst du das auch.

Gruß Wolfgang
 

Ähnliche Themen

Text mit mehreren Zeilen und Sonderzeichen ersetzten

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Bash-Skript Text suchen und ersetzen mit unterschiedlichen Trennzeichen

mehrzeiligen Text per Skript ersetzen

[BASH-Skript] Wildcard gesucht zum sed-Kommando

Zurück
Oben