sed Problem

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
Benutzeravatar
LeoLinux
Beiträge: 408
Registriert: 24.11.2005 17:58:47
Wohnort: Frankfurt Am Main

sed Problem

Beitrag von LeoLinux » 01.07.2010 21:19:21

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

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: sed Problem

Beitrag von gms » 01.07.2010 21:25:29

spricht was dagegen, diese Kommandos in ein Script auszulagern ? ( siehe -e Option )

Benutzeravatar
LeoLinux
Beiträge: 408
Registriert: 24.11.2005 17:58:47
Wohnort: Frankfurt Am Main

Re: sed Problem

Beitrag von LeoLinux » 01.07.2010 21:32:48

nein keines falls.
Bisher arbeite ich bereits so:

sed -E -i '' 's/SEARCH.*/REPLACE/' /usr/local/etc/amavisd.conf ;

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: sed Problem

Beitrag von gms » 01.07.2010 21:47:31

ä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 :D
Zuletzt geändert von gms am 01.07.2010 21:56:32, insgesamt 1-mal geändert.

Benutzeravatar
LeoLinux
Beiträge: 408
Registriert: 24.11.2005 17:58:47
Wohnort: Frankfurt Am Main

Re: sed Problem

Beitrag von LeoLinux » 01.07.2010 21:56:08

Ok, super - das probiere ich gleich aus!

Noch etwas: Wie bekomme ich ....


@av_scanners = (

ALLES DAZWISCHEN WEG !!!??

);



Ne Idee?

Grüße

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: sed Problem

Beitrag von gms » 01.07.2010 22:00:32

sed '/anfang/,/ende/d'

löscht von "angang" bis "ende"

Benutzeravatar
LeoLinux
Beiträge: 408
Registriert: 24.11.2005 17:58:47
Wohnort: Frankfurt Am Main

Re: sed Problem

Beitrag von LeoLinux » 01.07.2010 22:22:37

Das will irgendiwie nicht ganz ....:

Code: Alles auswählen

sed -E -i '' '/\@av_scanners = \(/,/\
\);\
/d' /usr/local/etc/amavisd.conf
... ergibt folgenden Fehler, obwohl ich ein "\" an die Enden der Zeilen gemacht habe:

Code: Alles auswählen

sed: 1: "/\@av_scanners = \(/,/\ ...": unterminated regular expression

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: sed Problem

Beitrag von gms » 02.07.2010 08:36:06

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


Benutzeravatar
LeoLinux
Beiträge: 408
Registriert: 24.11.2005 17:58:47
Wohnort: Frankfurt Am Main

Re: sed Problem

Beitrag von LeoLinux » 02.07.2010 09:38:53

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

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: sed Problem

Beitrag von gms » 02.07.2010 15:09:08

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.

Benutzeravatar
LeoLinux
Beiträge: 408
Registriert: 24.11.2005 17:58:47
Wohnort: Frankfurt Am Main

Re: sed Problem

Beitrag von LeoLinux » 02.07.2010 15:21:57

klar - nichts spricht gegen awk.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: sed Problem

Beitrag von gms » 02.07.2010 16:10:24

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:

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 ~ $ 

Benutzeravatar
Meillo
Moderator
Beiträge: 9280
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed Problem

Beitrag von Meillo » 04.07.2010 20:41:04

gms hat geschrieben:edit: vermutlich wird Meillo bald auftauchen und dir weitere Tipps geben :D
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. ;-)
Use ed once in a while!

Antworten