sed Problem
sed Problem
Hi,
ich habe ein Problem: Ich muss mit Hilfe eines Scripts folgendes in der amavis.conf abändern:
von:
# ['ClamAV-clamd',
# \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
# qr/\bOK$/m, qr/\bFOUND$/m,
# qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
nach:
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
abändern. leider bin ich am Verzweifeln, da ich beinahe vor jedes Zeichen einen Backslash setzen muss etc...
Gibt es da keine eifache Lösung, sodass ich alles zwischen Klammern oder so packen kann und er es in einem Stück frisst?
Besten Dank im Vorraus
ich habe ein Problem: Ich muss mit Hilfe eines Scripts folgendes in der amavis.conf abändern:
von:
# ['ClamAV-clamd',
# \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
# qr/\bOK$/m, qr/\bFOUND$/m,
# qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
nach:
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
qr/\bOK$/m, qr/\bFOUND$/m,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
abändern. leider bin ich am Verzweifeln, da ich beinahe vor jedes Zeichen einen Backslash setzen muss etc...
Gibt es da keine eifache Lösung, sodass ich alles zwischen Klammern oder so packen kann und er es in einem Stück frisst?
Besten Dank im Vorraus
Re: sed Problem
spricht was dagegen, diese Kommandos in ein Script auszulagern ? ( siehe -e Option )
Re: sed Problem
nein keines falls.
Bisher arbeite ich bereits so:
sed -E -i '' 's/SEARCH.*/REPLACE/' /usr/local/etc/amavisd.conf ;
Bisher arbeite ich bereits so:
sed -E -i '' 's/SEARCH.*/REPLACE/' /usr/local/etc/amavisd.conf ;
Re: sed Problem
ähm, ich habe eigentlich die '-f' Option gemeint,
wenn du deine Kommandos in ein solches Script einfügst, ersparst du dir das Quoting und das Escapen für die Shell ( zwischen Doppelhochkomma ).
statt
s/SEARCH.*/REPLACE/
kannst du auch
s|SEARCH.*|REPLACE|
schreiben und mußt daher die '/' Zeichen dazwischen nicht mehr escapen
edit: vermutlich wird Meillo bald auftauchen und dir weitere Tipps geben![Very Happy :D](./images/smilies/icon_biggrin.gif)
wenn du deine Kommandos in ein solches Script einfügst, ersparst du dir das Quoting und das Escapen für die Shell ( zwischen Doppelhochkomma ).
statt
s/SEARCH.*/REPLACE/
kannst du auch
s|SEARCH.*|REPLACE|
schreiben und mußt daher die '/' Zeichen dazwischen nicht mehr escapen
edit: vermutlich wird Meillo bald auftauchen und dir weitere Tipps geben
![Very Happy :D](./images/smilies/icon_biggrin.gif)
Zuletzt geändert von gms am 01.07.2010 21:56:32, insgesamt 1-mal geändert.
Re: sed Problem
Ok, super - das probiere ich gleich aus!
Noch etwas: Wie bekomme ich ....
@av_scanners = (
ALLES DAZWISCHEN WEG !!!??
);
Ne Idee?
Grüße
Noch etwas: Wie bekomme ich ....
@av_scanners = (
ALLES DAZWISCHEN WEG !!!??
);
Ne Idee?
Grüße
Re: sed Problem
sed '/anfang/,/ende/d'
löscht von "angang" bis "ende"
löscht von "angang" bis "ende"
Re: sed Problem
Das will irgendiwie nicht ganz ....:
... ergibt folgenden Fehler, obwohl ich ein "\" an die Enden der Zeilen gemacht habe:
Code: Alles auswählen
sed -E -i '' '/\@av_scanners = \(/,/\
\);\
/d' /usr/local/etc/amavisd.conf
Code: Alles auswählen
sed: 1: "/\@av_scanners = \(/,/\ ...": unterminated regular expression
Re: sed Problem
die Klammern sollten hier nicht escaped werden:
Code: Alles auswählen
gms@gms2 ~ $ cat x.txt
start
@av_scanners = (
ALLES DAZWISCHEN WEG !!!??
);
ende
gms@gms2 ~ $ sed '/^@av_scanners = (/,/^);/d' x.txt
start
ende
Re: sed Problem
Das Problem ist aber, dass innerhalb des Textes welcher wegrationalisiert werden soll auch derartige ");" sind ...
Das Ende lässt sich dadurch eindeutig machen, dass oberhalb der Klammer und unterhalb der Klammer eine leere Zeile ist. und das hat bei mir so nicht hingehauen: "unterminated regular expression" bekomme ich da immer, obwohl die Zeilen mit nem Backslash terminiert sind ... ;/
Grüße
Das Ende lässt sich dadurch eindeutig machen, dass oberhalb der Klammer und unterhalb der Klammer eine leere Zeile ist. und das hat bei mir so nicht hingehauen: "unterminated regular expression" bekomme ich da immer, obwohl die Zeilen mit nem Backslash terminiert sind ... ;/
Grüße
Re: sed Problem
dann brauchst du so etwas wie Multiline Patterns, sprich du must den Patternspace vorher auffüllen ( nach dem "@av_scanners" ) , damit du die Daten für deinen Multiline Pattern zur Verfügung hast
Mußt du das mittels sed bewerkstelligen ? Bei komplizierteren Problemen, würde ich eher awk, perl ... verwenden ( dort muß man nicht so "um die Ecke" denken ), oder bei komplexerer Syntax, wenn das Programm auch längere Zeit gewartet werden soll, eben einen Parsergenerator. Bei diesem ist der Initialaufwand relativ hoch, daher macht er sich eher nur auf längere Sicht bezahlt und weniger für einmalige Aufgaben.
Mußt du das mittels sed bewerkstelligen ? Bei komplizierteren Problemen, würde ich eher awk, perl ... verwenden ( dort muß man nicht so "um die Ecke" denken ), oder bei komplexerer Syntax, wenn das Programm auch längere Zeit gewartet werden soll, eben einen Parsergenerator. Bei diesem ist der Initialaufwand relativ hoch, daher macht er sich eher nur auf längere Sicht bezahlt und weniger für einmalige Aufgaben.
Re: sed Problem
klar - nichts spricht gegen awk.
Re: sed Problem
schnell heruntergetippt, vermutlich auch nicht sehr elegant, nur um zu zeigen, wie dieses Problem unter awk gelöst werden könnte:
Im wesentlichen brauchst du ja nur die Klammern zu zählen, und nachdem beim awk auch Variablen zur Verfügung stehen, macht das kein sonderliches Problem:
Im wesentlichen brauchst du ja nur die Klammern zu zählen, und nachdem beim awk auch Variablen zur Verfügung stehen, macht das kein sonderliches Problem:
Code: Alles auswählen
gms@sirius ~ $ cat x.awk
/^@av_scanners/ {
mode="av_scanners"
modelevel=0
}
mode=="av_scanners" {
if ( /\(/ ) {
modelevel=modelevel+1
}
if ( /\)/ ) {
modelevel=modelevel-1
}
if ( modelevel==0 ) {
mode=""
}
next
}
{ print }
gms@sirius ~ $
gms@sirius ~ $ cat x.txt
start
@av_scanners = (
@blabla = (
ALLES DAZWISCHEN WEG !!!??
);
);
ende
gms@sirius ~ $
gms@sirius ~ $ awk -f x.awk x.txt
start
ende
gms@sirius ~ $
Re: sed Problem
Normalerweise trifft das auch zu. Bin aber leider gerade sehr beschäftigt und konnte euch deshalb nicht mit weisen Ratschlägen beglücken. Aber ihr mir scheint, ihr habt das Problem auch ohne meinen Senf gelöst.gms hat geschrieben:edit: vermutlich wird Meillo bald auftauchen und dir weitere Tipps geben
![Wink ;-)](./images/smilies/icon_wink.gif)
Use ed once in a while!