Bash-Skript Text suchen und ersetzen mit unterschiedlichen Trennzeichen

K

kmuc

Grünschnabel
Hallo zusammen,

ich habe bereits diverse Google-Suchergebnisse durchforstet, habe jedoch nirgendwo eine verwertbare Lösung für mein Anliegen gefunden.
Vermutlich liegt dies aber auch an meiner fehlenden Erfahrung, daher möchte ich euch um Hilfe bitten.

Ich habe eine Datei mit einem vacation Bereich und möchte über ein Bash-Skript den Text des Autoresponders ändern können.

Der Dateiinhalt dieser Datei ist wie folgt strukturiert:

Code:
require  ["fileinto","vacation"];
vacation :days 1 :addresses ["adresse1@domain.de", "adresse2@domain.de"] 
[B]"Autoresponder-Text"[/B];
if header :container "subject" "***SPAM" {
fileinto "INBOX.Spam";
}
elsif [...]

Das "Autoresponder-Text" ist der Bereich, den ich ändern möchte.

Jetzt würde ich gerne nach "; suchen, da dies in jeder Datei das Ende des Autoresponder-Textes darstellt.
Den Anfang kann man mit ] " (mit Leerzeichen) definieren.
Wie kann ich jetzt mit einem Befehl diese festgesetzten Grenzen setzen?

Geht das überhaupt?

Mit awk und sed sehe ich da gerade keine vielversprechenden Möglichkeiten, da man offenbar keine unterschiedlichen "Grenzen" übergeben kann, oder?
 
Hi

Was möchtest du ändern? Definiert bitte nochmal den Start und raw ende des Bereichs .. ich raffs Net.
 
Das fettgedruckte in dem Codeabschnitt, bzw. genauer: das fettgedruckte ohne die Anführungszeichen, also das Autoresponder-Text, wobei dieser inhaltlich natürlich immer anders aussieht. Man kann also nicht nach dem Text selber suchen.

kurz gesagt: suche die erste Stelle im Text, die ] " (eckige Klammer,Leerzeichen,Anführungszeichen) ist und gib mir von dort an den gesamten Text bis "; (anführungszeichen,semikolon) erscheint.
 
Moin,

Mit einer Skriptsprache deiner Wahl, das ganze Zeilenweise durchgehen und die Zeilen bis "vacation :days*" einfach ausgeben, meintet wegen nach "head.vacation.rule".
Dann alles von "if header :container*" nach footer.vacation.rule schreiben.

Und am Ende "cat head.vacation.rule NEUER_TEXT footer.vacation.rule" > vacation.rule.

Nur weil du das dann im Textfile geändert hast, heißt das aber noch nicht, dass der dahinterstehende Imap-Server das aber auch anzieht.
Weiß grade nicht mehr welchen wir hie reinsetzten, aber hier mussen wir den Imap-Server dazu auffordern das ganze noch für sich selbst zu kompilieren.

mfg
HeadCrash
 
Danke für die gute Idee.
Ich hab jetzt folgendes:

Code:
while read line; do
        if expr "$line" : "vacation :days" > /dev/null || expr "$line" : "require" > /dev/null ; then
                header="$line"
                echo "$header"
        fi
done < default2

while read line; do
        if expr "$line" : "if header :contains" > /dev/null ; then
                footer="$line"
                echo "------------"
                echo "$footer"
        fi
done < default2

Die Ausgaben passen mit Ausnahme der Tatsache, dass beide mit expr: Syntaxfehler durchlaufen. Wieso?

edit... die footer Ausgabe passt doch noch nicht... aber das hat mit dem expr. Syntaxfehler nichts zu tun :(
 
Zuletzt bearbeitet:
Ich hätte gedacht dass du den : bei :days und :contains escapen musst...aber funktioniert bei mir auch ohne.

Rufe dein Script mal mit bash -x script.sh auf.
 
mit -x ist auch kein Fehler zu sehen.

Mal was anderes:
Wie kann ich denn ausdrücken, dass mir der Inhalt ab der Zeile mit "if header:contains" zurückgegeben wird?
D.h. die Zeile mit "if header:contains" plus alles was danach folgt...
 
Ich habs mittlerweile nochmal komplett neu angefangen, stoße gerade aber auf folgendes Problem:

Code:
if `echo $entry | awk -v FS=" " '{print $3}'` = "$datum" ; then

datum enthält das heute Tagesdatum im Format DD.MM.YYYY
Selbiges befindet sich in dem gefilterten $entry, beim Aufruf wird mir dann aber gesagt
"mysql.sh: Zeile 13: 09.12.2011: Kommando nicht gefunden."

Sieht da jmd. von euch auf Anhieb den Fehler?

edit: Hat sich erledigt... ich habs die [ ] um die Bedingung vergessen Oo
 
Zuletzt bearbeitet:
Zurück
Oben