Text ersetzten per Bash-Skript

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Sarajin, 24.09.2008.

  1. #1 Sarajin, 24.09.2008
    Zuletzt bearbeitet: 27.09.2008
    Sarajin

    Sarajin Grünschnabel

    Dabei seit:
    19.10.2004
    Beiträge:
    7
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 24.09.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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.
     
  4. #3 Sarajin, 24.09.2008
    Sarajin

    Sarajin Grünschnabel

    Dabei seit:
    19.10.2004
    Beiträge:
    7
    Zustimmungen:
    0
    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?
     
  5. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    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
     
  6. #5 Sarajin, 27.09.2008
    Zuletzt bearbeitet: 27.09.2008
    Sarajin

    Sarajin Grünschnabel

    Dabei seit:
    19.10.2004
    Beiträge:
    7
    Zustimmungen:
    0
    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?
     
  7. #6 Gott_in_schwarz, 27.09.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    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/}'
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 Sarajin, 02.12.2008
    Sarajin

    Sarajin Grünschnabel

    Dabei seit:
    19.10.2004
    Beiträge:
    7
    Zustimmungen:
    0
     
  10. #8 Wolfgang, 03.12.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
Thema:

Text ersetzten per Bash-Skript

Die Seite wird geladen...

Text ersetzten per Bash-Skript - Ähnliche Themen

  1. Text mit mehreren Zeilen und Sonderzeichen ersetzten

    Text mit mehreren Zeilen und Sonderzeichen ersetzten: Hallo zusammen, ich bin in Sachen Programmierung noch relativ neu und frisch unterwegs und bräuchte etwas Unterstützung wenn möglich. Im...
  2. Text suchen und ersetzten

    Text suchen und ersetzten: Hallo zusammen =), hab da so ein kleines problem und zwar gibt es ja den suchen und ersetzen befehl im vi... nur mein problem ist das ich...
  3. Kontextmenü mit einem Skript verbinden

    Kontextmenü mit einem Skript verbinden: Abend, wenn ich z. B. eine simple Umwandlung eines Bildformates in ein anderes über das KDE-Kontextmenü (Servicemenü nennt es sich im KDE oder...
  4. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  5. [code]Text[/code] im Editor nicht mehr vorhanden

    [code]Text[/code] im Editor nicht mehr vorhanden: Hallo, früher gab es im Editor noch den Button für das erstellen von Code-Segmenten. Ich hab das für Konsolen-Output oder angabe von Befehlen...