Mit sed $ARRAY ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Staphylea
Beiträge: 10
Registriert: 14.01.2014 23:08:26

Mit sed $ARRAY ersetzen

Beitrag von Staphylea » 14.01.2014 23:45:08

Hallo Forum,

mein Ziel ist es eine Textdatei so zu parsen dass ich die Daten mit dem Google Command Line Tool zu meinem Kalender pushen kann. Die Ausgangsdatei hat hin und wieder Namen in Form von "Vornam. Nachnam" am Zeilenanfang stehen (Dadurch verschiebt sich alles). Diese möchte ich mit sed durch nichts ersetzen. Anschließend durch awk zurechtstutzen.
Folgender Ansatz funktioniert:

Code: Alles auswählen

sed 's/P\. Pan//g' <input.txt> ausgabe.txt
Da es nun doch ein paar Namen sind, dachte ich mir ein Array zu nutzen.

Code: Alles auswählen

declare -a KILLNAM=('M. Meier' 'P.Pan' 'H.Doof')
Soweit so gut. Nur komme ich mit der Syntax für sed ned klar. ( sed '/s/$Array//g' ) Habe vermutet dies in Form von umsetzen

Code: Alles auswählen

sed 's/${KILLNAM[*]}//g' <input.txt> ausgabe.txt
zu können.
Hab nun auch viele viele viele Variationen mit Single und Double Quotes und Klammern und ich weiß nicht was versucht, es gelingt mir nicht die richtige Syntax zu finden. :x (was mich echt ärgert)
Ich denke das Problem ist der Punkt und/oder auch das BLANK danach. Somit wird das Array nicht als solches von sed verarbeitet.

Ein anderer Ansatz wäre alles vom Zeilenanfang bis zu einem dieser Zeichen zu löschen [0123]. Da die nächst relevante Spalte ein Datum mit führender Null enthält.

Code: Alles auswählen

sed 's/^ ([0123])//g'<input.txt> ausgabe.txt
Bringt nun leider auch nicht den von mir gewünschten Output. :?
Ich fänds Super wenn Ihr mir vielleicht zu dem einen oder anderen Punkt ein paar Tips oder Anstupser geben könntet.

Vielen lieben Dank
Staphylea

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Mit sed $ARRAY ersetzen

Beitrag von linuxCowboy » 15.01.2014 05:59:14

Stupser:

Code: Alles auswählen

sed 's/^[^0-3]\+//'
-der_linux_cowboy --- Besser werden! ... f*** w$$

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Mit sed $ARRAY ersetzen

Beitrag von rendegast » 15.01.2014 09:01:21

vielleicht
sed '....'
->
sed "...."
die Single-Quotes verhindern wohl das Auflösen der Variablen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Phineas
Beiträge: 354
Registriert: 20.06.2012 20:26:19

Re: Mit sed $ARRAY ersetzen

Beitrag von Phineas » 15.01.2014 18:28:05

Staphylea hat geschrieben:Diese möchte ich mit sed durch nichts ersetzen. Anschließend durch awk zurechtstutzen.
Performanter und eleganter ist es, die komplette Aufgabe mit awk zu lösen (bzw. komplett mit sed).

Sed kann jedenfalls mit einem Shell-Array nichts anfangen. Das will in einer Shell-Schleife Feld für Feld abgearbeitet, oder in einen regulären Ausdruck umgewandelt werden.

Staphylea
Beiträge: 10
Registriert: 14.01.2014 23:08:26

Re: Mit sed $ARRAY ersetzen

Beitrag von Staphylea » 16.01.2014 22:00:01

Vielen Dank für die Antworten!
Das mit dem Array war viel zu kompliziert von mir gedacht. (ich dachte erst alle "echten Zeichen" zu löschen, damit die Spalten wieder übereinstimmen um sie danach mit awk rauszufiltern).

Der "Stupser" von linuxCowboy war genau der richtige. :THX:

@Phineas: Das mit der Schleife ist schon klar, nur hat sed mit meiner Syntax auch nie den ersten Index des Array verarbeitet.
@rendegast: leider auch nicht mit den "" damit hab ich auch viel rumexperimentiert

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Mit sed $ARRAY ersetzen

Beitrag von newdeb » 17.01.2014 07:57:50

sed verarbeitet keine Bash-Arrays, sondern Muster (Reguäre Ausdrücke).
Dein Namens-Array wird noch von der Shell aufgelöst (Quotierung mit "" vorausgesetzt):

Code: Alles auswählen

$ sed "s/${KILLNAM[*]}//g"
+ sed 's/M. Meier P.Pan H.Doof//g'
sed sucht nach genau diesem Muster, also der ganzen Namensliste (die Punkte müssten noch entwertet werden).
Klar, das dann nichts gefunden wird.

Antworten