Hi ist es möglich und wenn ja wie, mittels sed in einer Datei an eine bestimmte Zeile (Z.B. Suchmuster "AB HIER") eine neue Zeile anzuhängen ? Das Ganze sollte jedoch in einem Skript mittels "sed -e " gemacht werden. Also wie bspw. beim Suchen und Ersetzen: sed -e s/AB HIER/NICHT HIER/g Nur eben eine Zeile nach "AB HIER" anhängen. -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hi Jens, Jens Strohschnitter schrieb:
ist es möglich und wenn ja wie, mittels sed in einer Datei an eine bestimmte Zeile (Z.B. Suchmuster "AB HIER") eine neue Zeile anzuhängen ? Das Ganze sollte jedoch in einem Skript mittels "sed -e " gemacht werden.
Also wie bspw. beim Suchen und Ersetzen: sed -e s/AB HIER/NICHT HIER/g Nur eben eine Zeile nach "AB HIER" anhängen.
ich weis das es mit sed geht, es ist aber tricky wenn es mit sed über zeilengrenzen geht. Wenn es also nicht zwingend sed sein muss dann nimm doch einfach das gute alte awk awk '{print $0}/AB HIER/{print "inhalt der neuen Zeile";}' <eingabefile >ausgabefile awk macht immer für jede Zeile des eingabefiles das was in den geschweiften klammern steht, steht vor der geschweiften klammer ein suchmuster /suchmuster/ dann führt awk die anweisungen in der Klammer nur dann aus wenn das Suchmuster gefunden wird. Von den //{} Blöcken kann es beliebig viele geben. für den Anfang und das Ende der Datei gibt es noch BEGIN{} und END{} wo man Anweisungen rein schreibt die vor und nach der Verarbeitung des Eingabefiles ausgeführt werden. gegeben sei eine datei t a b c d e f g $awk '{print $0}/c/{print "ff"}' < t a b c ff d e f g Gruss Falk
ist es möglich und wenn ja wie, mittels sed in einer Datei an eine bestimmte Zeile (Z.B. Suchmuster "AB HIER") eine neue Zeile anzuhängen ? Das Ganze sollte jedoch in einem Skript mittels "sed -e " gemacht werden.
Also wie bspw. beim Suchen und Ersetzen: sed -e s/AB HIER/NICHT HIER/g Nur eben eine Zeile nach "AB HIER" anhängen.
ich weis das es mit sed geht, es ist aber tricky wenn es mit sed über zeilengrenzen geht.
Wenn es also nicht zwingend sed sein muss dann nimm doch einfach das gute alte awk
awk '{print $0}/AB HIER/{print "inhalt der neuen Zeile";}' <eingabefile >ausgabefile
awk macht immer für jede Zeile des eingabefiles das was in den geschweiften klammern steht, steht vor der geschweiften klammer ein suchmuster /suchmuster/ dann führt awk die anweisungen in der Klammer nur dann aus wenn das Suchmuster gefunden wird. Von den //{} Blöcken kann es beliebig viele geben. für den Anfang und das Ende der Datei gibt es noch BEGIN{} und END{} wo man Anweisungen rein schreibt die vor und nach der Verarbeitung des Eingabefiles ausgeführt werden.
gegeben sei eine datei t
a b c d e f g
$awk '{print $0}/c/{print "ff"}' < t a b c ff d e f g
Hi, perfekt! Genau sowas habe ich gesucht. Danke. -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
O
ist es möglich und wenn ja wie, mittels sed in einer Datei an eine bestimmte Zeile (Z.B. Suchmuster "AB HIER") eine neue Zeile anzuhängen ? Das Ganze sollte jedoch in einem Skript mittels "sed -e " gemacht werden.
Also wie bspw. beim Suchen und Ersetzen: sed -e s/AB HIER/NICHT HIER/g Nur eben eine Zeile nach "AB HIER" anhängen.
ich weis das es mit sed geht, es ist aber tricky wenn es mit sed über zeilengrenzen geht.
Wenn es also nicht zwingend sed sein muss dann nimm doch einfach das gute alte awk
awk '{print $0}/AB HIER/{print "inhalt der neuen Zeile";}' <eingabefile >ausgabefile
awk macht immer für jede Zeile des eingabefiles das was in den geschweiften klammern steht, steht vor der geschweiften klammer ein suchmuster /suchmuster/ dann führt awk die anweisungen in der Klammer nur dann aus wenn das Suchmuster gefunden wird. Von den //{} Blöcken kann es beliebig viele geben. für den Anfang und das Ende der Datei gibt es noch BEGIN{} und END{} wo man Anweisungen rein schreibt die vor und nach der Verarbeitung des Eingabefiles ausgeführt werden.
Ups, zu früh gefreut. Wenn die Zeile, die eingefügt werden soll in einer Variablen steht, also z.B. x="Hier die neue Zeile" und ich den Befehl eingebe: awk '{print $0}/AB HIER/{print "$x";}' <x >y wird leider nur $x statt der Inhalt eingefügt. Habe das Ganze mal mit anderen Varianten ausprobiert: '$x' "$x" usw. aber leider kein Erfolg. Was müsste ich denn hierfür angeben ? -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hi Jens, Jens Strohschnitter schrieb:
Ups, zu früh gefreut. Wenn die Zeile, die eingefügt werden soll in einer Variablen steht, also z.B. x="Hier die neue Zeile" und ich den Befehl eingebe:
awk '{print $0}/AB HIER/{print "$x";}' <x >y
wird leider nur $x statt der Inhalt eingefügt. Habe das Ganze mal mit anderen Varianten ausprobiert: '$x' "$x" usw. aber leider kein Erfolg. Was müsste ich denn hierfür angeben ?
ganz einfach: awk 'BEGIN{x="Hier die neue Zeile"}{print $0}/c/{print x}' < t a b c Hier die neue Zeile d e f g awk ist auch ein /bischen/ anders, genau wie sed :-) Gruss Falk
Hi On Wednesday 25 August 2004 13:41, Jens Strohschnitter wrote:
Ups, zu früh gefreut. Wenn die Zeile, die eingefügt werden soll in einer Variablen steht, also z.B. x="Hier die neue Zeile" und ich den Befehl eingebe: Alles in den ' (Hochkommas) wird so als Programm an awk übergeben.
awk '{print $0}/AB HIER/{print "$x";}' <x >y In diesem Fall führt awk {print $0}/AB HIER/{print "$x";} aus.
Man kann das als shell-Skript als x=Einfügetext awk '{print $0}/AB HIER/{print "'$x'";}' schreiben. Für das $x sind die '' dann aufgehoben, die Anführungszeichen werden so wie sie sind an awk übergeben, weil sie ihrerseits in Hochkommas stehen und awk bekommt ein {print $0}/AB HIER/{print "Einfügetext";} übergeben. Aber schön ist das nicht. :-) Ich habe es selber noch nicht getestet, aber es gibt bei awk die Option -v. Das ist sicherlich der sauberere Weg shell-Variablen innerhalb von awk Programmen zu benutzen. mfg Axel
Ups, zu früh gefreut. Wenn die Zeile, die eingefügt werden soll in einer Variablen steht, also z.B. x="Hier die neue Zeile" und ich den Befehl eingebe: Alles in den ' (Hochkommas) wird so als Programm an awk übergeben.
awk '{print $0}/AB HIER/{print "$x";}' <x >y In diesem Fall führt awk {print $0}/AB HIER/{print "$x";} aus.
Man kann das als shell-Skript als x=Einfügetext awk '{print $0}/AB HIER/{print "'$x'";}' schreiben. Für das $x sind die '' dann aufgehoben, die Anführungszeichen werden so wie sie sind an awk übergeben, weil sie ihrerseits in Hochkommas stehen und awk bekommt ein {print $0}/AB HIER/{print "Einfügetext";} übergeben.
Aber schön ist das nicht. :-) Ich habe es selber noch nicht getestet, aber es gibt bei awk die Option -v. Das ist sicherlich der sauberere Weg shell-Variablen innerhalb von awk Programmen zu benutzen.
Hi, das funktioniert leider nur solange, wie der Variableninhalt keine Leer- zeichen enthält. Sobalt der Inhalt x="Einfüge Text" lautet, bricht awk leider ab. Aber nach bisserl rumprobiererei gings dann mit: x="whitelist_from *@nospammers.org" awk '{print $0}/whitelist-users/{print "'"$x"'";}' Lustige Quoterei :-) -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hi On Wednesday 25 August 2004 14:24, Jens Strohschnitter wrote:
Aber schön ist das nicht. :-) .....<Hinweis>.... das funktioniert leider nur solange, wie der Variableninhalt keine Leer- zeichen enthält. Sobalt der Inhalt x="Einfüge Text" lautet, bricht awk leider ab. Mit obigem wollte ich zum Ausdruck bringen, dass es vermutlich sinnvoller ist einen anderen Lösungsansatz zu verfolgen. Aber nach bisserl rumprobiererei gings dann mit:
x="whitelist_from *@nospammers.org" awk '{print $0}/whitelist-users/{print "'"$x"'";}'
Lustige Quoterei :-) Ich weiß ja nicht.... Ein awk-Skript in der Bash erst zusammenzusetzen, um es dann auszuführen.... Einen Preis für übersichtiliches Programmieren wirst du so nie gewinnen. Besser so:
x="whitelist_from *@nospammers.org" awk -v einf="$x" '{print $0}\ /whitelist-users/{print einf }' Es sollen sich schonmal Leute bis in Irrenhaus gequotet haben. :-) mfg Axel
Hallo, Am Wed, 25 Aug 2004, Jens Strohschnitter schrieb:
ist es möglich und wenn ja wie, mittels sed in einer Datei an eine bestimmte Zeile (Z.B. Suchmuster "AB HIER") eine neue Zeile anzuhängen ? Das Ganze sollte jedoch in einem Skript mittels "sed -e " gemacht werden.
Also wie bspw. beim Suchen und Ersetzen: sed -e s/AB HIER/NICHT HIER/g Nur eben eine Zeile nach "AB HIER" anhängen.
sed -e '/AB HIER/a\ Hier die neue Zeile' < datei > ausgabedatei Das findet man uebrigens, wenn man 'man sed' mal liest. -dnh -- "Sorry, I'm currently working with simpler life forms. Nothing with a backbone." -- "Winston Scudder Thurmad" "Oh. Can I have a middle manager then?" -- "Helix" [from "Freefall" [http://freefall.purrsia.com/ff600/fv00507.htm]
ist es möglich und wenn ja wie, mittels sed in einer Datei an eine bestimmte Zeile (Z.B. Suchmuster "AB HIER") eine neue Zeile anzuhängen ? Das Ganze sollte jedoch in einem Skript mittels "sed -e " gemacht werden.
Also wie bspw. beim Suchen und Ersetzen: sed -e s/AB HIER/NICHT HIER/g Nur eben eine Zeile nach "AB HIER" anhängen.
sed -e '/AB HIER/a\ Hier die neue Zeile' < datei > ausgabedatei
Das findet man uebrigens, wenn man 'man sed' mal liest.
Yep! Nur wusste ich nicht dass man mit ' ein Kommando auch auf mehrere Zeilen verzeilen kann. Das stand natürlich nicht in man sed. Hilft mir aber jetzt für so manch andere Probleme weiter. Danke. -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hi On Wednesday 25 August 2004 13:04, Jens Strohschnitter wrote:
Yep! Nur wusste ich nicht dass man mit ' ein Kommando auch auf mehrere Zeilen verzeilen kann. Das stand natürlich nicht in man sed. Hilft mir aber jetzt für so manch andere Probleme weiter. Danke. Das ist ein feature der Bash. Die ' dienen dazu den text des sed-programms als einen String an sed zu übergeben. Ohne Leerzeichen ginge es z.B. auch so. (auch wenn es eine nützliche Angewohnheit ist immer die Hochkommas zu setzen zu machen) sed -e /AB HIER/a\ Hier_die_neue_Zeile < datei > ausgabedatei
Die Zeilenfortsetzung ermöglicht der \ von dem <newline>. Daher zu finden in der manpage von bash unter QUOTING. mfg Axel
Hallo, Am Wed, 25 Aug 2004, Axel Heinrici schrieb:
Hi
On Wednesday 25 August 2004 13:04, Jens Strohschnitter wrote:
Yep! Nur wusste ich nicht dass man mit ' ein Kommando auch auf mehrere Zeilen verzeilen kann. Das stand natürlich nicht in man sed. Hilft mir aber jetzt für so manch andere Probleme weiter. Danke. Das ist ein feature der Bash. Die ' dienen dazu den text des sed-programms als einen String an sed zu übergeben. Ohne Leerzeichen ginge es z.B. auch so. (auch wenn es eine nützliche Angewohnheit ist immer die Hochkommas zu setzen zu machen) sed -e /AB HIER/a\ Hier_die_neue_Zeile < datei > ausgabedatei
Das wird nicht funktionieren. Denn den einzelen Backslash frisst die shell auf. Auch in einem sed-script: ==== #! /usr/bin/sed -f /AB HIER/a\ Hier die erste neue Zeile\ hier die zweite s/foo/bar/g ==== muessen die '\' eingegeben werden. Wie sollte 'sed' denn sonst unterscheiden, ob das 'H' des 'Hier' und das 'h' des 'hier' ein sed-Befehl ist? Du wirst also 'Extra characters after command' oder ein Unknown command: ``<erstes_Zeichen_der_Zeile>'' bekommen. -dnh -- 28: ... werden wir den Schutz Minderjähriger in den Vordergrund stellen. Im Grunde weiß ich genausowenig über die ganze Sache wie meine Wähler, aber verbieten bringt mehr Stimmen. (Peter Berlich)
Hi On Wednesday 25 August 2004 18:26, David Haller wrote:
Ohne Leerzeichen ginge es z.B. auch so. (auch wenn es eine nützliche Angewohnheit ist immer die Hochkommas zu setzen zu machen) sed -e /AB HIER/a\ Hier_die_neue_Zeile < datei > ausgabedatei
Das wird nicht funktionieren.
Denn den einzelen Backslash frisst die shell auf.
Das Leerzeichen in der regex AB HIER ist der Fehler. Ich schrieb ja auch ohne Leerzeichen. Genauergenommen ohne escapete Leerzeichen (übles germlish gebe ich zu). Der Beispieltext ist einfach falsch :-) Gerade nochmal ausprobiert mit bash: Skript namens Zeilenfortsetzung <===================== #!/bin/bash sed /zweite/a\ Einsubtext\ \ mit\ Fortsetzung =====================> $> echo -e "erste Zeile\nzweite Zeile\ndritte Zeile" |./Zeilenfortsetzung erste Zeile zweite Zeile Einsubtext mit Fortsetzung dritte Zeile \<newline> wird von der shell erkannt und nicht an sed weitergeleitet. Aber die beiden Zeilen werden dann von der bash an sed auch ohne backslash und eben auch ohne <newline> übergeben. Damit ist doch alles wieder in Ordnung.
muessen die '\' eingegeben werden. Wie sollte 'sed' denn sonst unterscheiden, ob das 'H' des 'Hier' und das 'h' des 'hier' ein sed-Befehl ist? Sed bekommt von den \ am Zeilenende doch sowieso nichts zu sehen. Du wirst also 'Extra characters after command' oder ein Unknown command: ``<erstes_Zeichen_der_Zeile>'' bekommen. <=============eine Zeile====== $> echo -e "erste\nzweite\ndritte" |sed /zweite/aEinsubtext\ mit\ Fortsetzung ==============eine Zeile====== Geht (zumindest bei GNU sed) doch auch? Benutzt du einen anderen sed oder eine andere shell? Ich habe sed 3.02.80 und bash 2.05b.0(1).
mfg Axel
Hallo, Am Thu, 26 Aug 2004, Axel Heinrici schrieb:
On Wednesday 25 August 2004 18:26, David Haller wrote:
Ohne Leerzeichen ginge es z.B. auch so. (auch wenn es eine nützliche Angewohnheit ist immer die Hochkommas zu setzen zu machen) sed -e /AB HIER/a\ Hier_die_neue_Zeile < datei > ausgabedatei
Das wird nicht funktionieren.
Denn den einzelen Backslash frisst die shell auf. [..] Gerade nochmal ausprobiert mit bash: Skript namens Zeilenfortsetzung <===================== #!/bin/bash
sed /zweite/a\ Einsubtext\ \ mit\ Fortsetzung =====================> $> echo -e "erste Zeile\nzweite Zeile\ndritte Zeile" |./Zeilenfortsetzung erste Zeile zweite Zeile Einsubtext mit Fortsetzung dritte Zeile
$ echo -e "erste Zeile\nzweite Zeile\ndritte Zeile" | sed /zweite/a\
Einsubtext\ \ mit\ Fortsetzung sed: -e expression #1, char 10: Extra characters after command
\<newline> wird von der shell erkannt und nicht an sed weitergeleitet. Aber die beiden Zeilen werden dann von der bash an sed auch ohne backslash und eben auch ohne <newline> übergeben. Damit ist doch alles wieder in Ordnung.
Eben nicht. sed verlangt die backslashes (s.u.). Deswegen muss man diese auch angeben, wenn man die Expression quoted: $ echo -e "erste Zeile\nzweite Zeile\ndritte Zeile" | sed '/zweite/a
Einsubtext mit Fortsetzung' sed: -e expression #1, char 10: Extra characters after command
$ echo -e "erste Zeile\nzweite Zeile\ndritte Zeile" | sed '/zweite/a\ Einsubtext\ mit Fortsetzung' erste Zeile zweite Zeile Einsubtext mit Fortsetzung dritte Zeile Das ist auch der Grund, warum selbst bei dir der Zeilenumbruch bei der " mit Fortsetzung" ignoriert wird.
Geht (zumindest bei GNU sed) doch auch? Benutzt du einen anderen sed oder eine andere shell? Ich habe sed 3.02.80 und bash 2.05b.0(1).
GNU sed 3.02, GNU bash 2.03.0(1) (an der bash liegt's aber nicht). Dass der Backslash hinter dem 'a'-Befehl weggelassen werden kann (und weswegen bei dir keine Fehlermeldung kommt) ist eine Eigenheit von GNU sed >= 3.02.80. Mit jedem anderen sed fliegt dir so ein script um die Ohren. Und auch dein GNU sed behandelt den Backslash richtig, wenn man ihn einfuegt (siehe mein zweites Beispiel), d.h. das wird auch bei dir richtig funktionieren. -dnh -- Treffen sich zwei Viren im Outlook. Meint der eine "eigentlich bin ich ja Künstler..."
Jens Strohschnitter wrote:
[ sed, awk ]
Nur so als Info: fuer eine erweiterte Einfuehrung kannst Du Dir ja mal http://www.thomashertweck.de/sedawk.html anschauen... Gruesse, Thomson
Hallo, Am Wed, 25 Aug 2004, Thomas Hertweck schrieb:
Jens Strohschnitter wrote:
[ sed, awk ]
Nur so als Info: fuer eine erweiterte Einfuehrung kannst Du Dir ja mal http://www.thomashertweck.de/sedawk.html anschauen...
Nett ;) Allerdings: * /such1/such2/ Hier werden alle Zeilen zwischen dem Textmuster such1 und such2 (jeweils wiederum inklusive) angesprochen. Muesste '/such1/,/such2/' sein. Und bei den REs wuerfelst du Basic- und Extended-REs durcheinander: '\(\)' und '\{\}' sind BRE |, + und ? sind ERE Also entweder '\(\), \{\}, \|, \+, \?' oder '(), {}, |, +, ?'. -dnh -- "Since the prairies see westerly winds more often than not, that must mean that either Calgary blows or Toronto sucks. Take your pick." -- D. Joseph Creighton
Hallo David, David Haller wrote:
Am Wed, 25 Aug 2004, Thomas Hertweck schrieb:
Nur so als Info: fuer eine erweiterte Einfuehrung kannst Du Dir ja mal http://www.thomashertweck.de/sedawk.html anschauen...
Nett ;)
erst einmal Danke fuers Drueberschauen. Es ist doch gut, wenn mehrere Leute so etwas korrekturlesen :-)
Allerdings: * /such1/such2/ Hier werden alle Zeilen zwischen dem Textmuster such1 und such2 (jeweils wiederum inklusive) angesprochen.
Muesste '/such1/,/such2/' sein.
Korrekt, das habe ich geaendert.
Und bei den REs wuerfelst du Basic- und Extended-REs durcheinander:
'\(\)' und '\{\}' sind BRE |, + und ? sind ERE
Also entweder '\(\), \{\}, \|, \+, \?' oder '(), {}, |, +, ?'.
Hmm, Du hast Recht, dass es gemischt ist. Aber wie sollte ich das genau aendern? Ich habe leider festgestellt, dass nicht alle Programme alle Formen akzeptieren. So wie es momentan steht, scheint es IMO am Besten zu funktionieren... Du kannst mir ggf. ja (falls Du kurz Zeit hast) ein diff-File zum Patchen auf die aktuelle Version 0.2 schicken (die ist online), dann verstehe ich vielleicht besser, wie Du das genau meinst und ob die Beispiele dann noch funktionieren... :) Gruesse, Th.
Hallo, Am Wed, 25 Aug 2004, Thomas Hertweck schrieb:
David Haller wrote: [..]
Und bei den REs wuerfelst du Basic- und Extended-REs durcheinander:
'\(\)' und '\{\}' sind BRE |, + und ? sind ERE
Also entweder '\(\), \{\}, \|, \+, \?' oder '(), {}, |, +, ?'.
Hmm, Du hast Recht, dass es gemischt ist. Aber wie sollte ich das genau aendern?
Du musst wohl oder uebel auf beide Formen der REs eingehen, denn sed verwendet BRE und awk ERE. -dnh -- "But you should never let rules overrule common sense - if you do, you end up doing stupid things" -- Linus Torvalds
participants (5)
-
Axel Heinrici
-
David Haller
-
Falk Sauer
-
Jens Strohschnitter
-
Thomas Hertweck