Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

In einem Textfile eine Zeile einfügen

27 views
Skip to first unread message

Helmut Schneider

unread,
May 17, 2012, 12:33:04 PM5/17/12
to
Hi,

ich möchte in einem Textfile eine Zeile einfügen. Nachdem ich alles
mögliche ausprobiert hatte, dachte ich, die Lösung gefunden zu haben:

helmut@mail:~$ echo "Zeile ganz oben" | sed "1s#.*#Zeile *ganz*
oben\\`echo -e '\n\r'`&#"
Zeile *ganz* oben
Zeile ganz oben
helmut@mail:~$

Das funktionierte auch überall - bis auf die &%$$&§% dash (mal wieder):

helmut@mail:~$ sh
$ echo "Zeile ganz oben" | sed "1s#.*#Zeile *ganz* oben\\`echo -e
'\n\r'`&#"
sed: -e expression #1, char 27: unterminated `s' command
$

Bekomme ich das irgendwie portabel hin? Ich muss zwingend mit Variablen
arbeiten können, etwa so:

helmut@mail:~$ text1="Zeile ganz oben"; text2="Text *ganz* oben"; echo
${text1} | sed "1s#.*#${text2}\\`echo -e '\n\r'`&#"
Zeile *ganz* oben
Zeile ganz oben
helmut@mail:~$


Danke und Gruß, Helmut

Juergen P. Meier

unread,
May 18, 2012, 12:42:54 AM5/18/12
to
Helmut Schneider <jump...@gmx.de>:
> ich möchte in einem Textfile eine Zeile einfügen. Nachdem ich alles
> mögliche ausprobiert hatte, dachte ich, die Lösung gefunden zu haben:

Nicht sed, sondern ex ist dein Freund.

Konzeptionell schon (Das s in sed steht fuer *Stream*)

> Danke und Gruß, Helmut

Probier es einfach mal mit ex.

David Haller

unread,
May 18, 2012, 2:59:34 AM5/18/12
to
On Thu, 17 May 2012 18:32:40, Helmut Schneider <jump...@gmx.de> wrote:
> ich mᅵchte in einem Textfile eine Zeile einfᅵgen. Nachdem ich alles
> mᅵgliche ausprobiert hatte, dachte ich, die Lᅵsung gefunden zu haben:
>
> helmut@mail:~$ echo "Zeile ganz oben" | sed "1s#.*#Zeile *ganz*
> oben\\`echo -e '\n\r'`&#"
> Zeile *ganz* oben
> Zeile ganz oben
> helmut@mail:~$

$ echo "Zeile ganz oben" | sed '1i\
Zeile *ganz* oben
'

HTH,
-dnh

--
"Microsoft admitted its Vista operating system was a 'less good
product' in what IT experts have described as the most ambitious
understatement since the captain of the Titanic reported some
slightly damp tablecloths." http://www.thedailymash.co.uk/

Helmut Schneider

unread,
May 18, 2012, 4:38:25 AM5/18/12
to
David Haller wrote:

> On Thu, 17 May 2012 18:32:40, Helmut Schneider <jump...@gmx.de>
> wrote:
> > ich mᅵchte in einem Textfile eine Zeile einfᅵgen. Nachdem ich alles
> > mᅵgliche ausprobiert hatte, dachte ich, die Lᅵsung gefunden zu
> > haben:
> >
> > helmut@mail:~$ echo "Zeile ganz oben" | sed "1s#.*#Zeile ganz
> > oben\\`echo -e '\n\r'`&#"
> > Zeile ganz oben
> > Zeile ganz oben
> > helmut@mail:~$
>
> $ echo "Zeile ganz oben" | sed '1i\
> Zeile ganz oben
> '

Das ist leider alles andere als portabel.

Helmut Schneider

unread,
May 18, 2012, 4:43:55 AM5/18/12
to
Juergen P. Meier wrote:

> Helmut Schneider <jump...@gmx.de>:
> > ich möchte in einem Textfile eine Zeile einfügen. Nachdem ich alles
> > mögliche ausprobiert hatte, dachte ich, die Lösung gefunden zu
> > haben:
>
> Nicht sed, sondern ex ist dein Freund.
>
> Konzeptionell schon (Das s in sed steht fuer Stream)
>
> > Danke und Gruß, Helmut
>
> Probier es einfach mal mit ex.

Hm, irgendwie:

helmut@ubuntu:~$ cat ./test.txt; echo '1i\nNew Line Goes Here\n.\nwq' |
ex -s ./test.txt; cat ./test.txt
Test1
Test2
Test1
Test2
helmut@ubuntu:~$

David Haller

unread,
May 18, 2012, 4:22:27 PM5/18/12
to
Was bitteschᅵn ist daran nicht portabel?

Vgl. auch:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html

-dnh

--
Power corrupts, PowerPoint corrupts absolutely. -- Vint Cerf

Helmut Schneider

unread,
May 19, 2012, 5:45:33 AM5/19/12
to
David Haller wrote:

> On Fri, 18 May 2012 10:38:01, Helmut Schneider <jump...@gmx.de>
> wrote:
> > David Haller wrote:
> >> On Thu, 17 May 2012 18:32:40, Helmut Schneider <jump...@gmx.de>
> >> wrote:
> >> > ich mᅵchte in einem Textfile eine Zeile einfᅵgen. Nachdem ich
> >> > alles mᅵgliche ausprobiert hatte, dachte ich, die Lᅵsung
> >> > gefunden zu haben:
> >> >
> >> > helmut@mail:~$ echo "Zeile ganz oben" | sed "1s#.*#Zeile ganz
> >> > oben\\`echo -e '\n\r'`&#"
> >> > Zeile ganz oben
> >> > Zeile ganz oben
> >> > helmut@mail:~$
> >>
> >> $ echo "Zeile ganz oben" | sed '1i\
> >> Zeile ganz oben
> >> '
> >
> > Das ist leider alles andere als portabel.
>
> Was bitteschᅵn ist daran nicht portabel?

Stimmt, portable war nicht das Problem.

[helmut@BSDHelmut ~]$ echo "Zeile ganz oben" | sed '1i\
Zeile ganz oben




'
Zeile ganz oben
Zeile ganz oben
[helmut@BSDHelmut ~]$

Das war das Problem...

Als "Workaround" hatte ich dann gefunden:

echo "one,two,three" | sed "s/,/\\`echo -e '\n\r'`/g"

Aber dann kam wieder die dash:

$ echo "one,two,three" | sed "s/,/\\`echo -e '\n\r'`/g"
sed: -e expression #1, char 8: unterminated `s' command
$

Christian Brabandt

unread,
May 19, 2012, 8:24:04 AM5/19/12
to
On 2012-05-19, Helmut Schneider <jump...@gmx.de> wrote:
> [helmut@BSDHelmut ~]$ echo "Zeile ganz oben" | sed '1i\
> Zeile ganz oben
>
>
>
>
> '
> Zeile ganz oben
> Zeile ganz oben
> [helmut@BSDHelmut ~]$
>
> Das war das Problem...

,----[ http://pubs.opengroup.org/onlinepubs/009695399/utilities/sed.html ]-
| The argument text shall consist of one or more lines. Each embedded
| <newline> in the text shall be preceded by a backslash. Other
| backslashes in text shall be removed, and the following character shall
| be treated literally.
`----

#v+
chrisbra@home~ % echo "Zeile ganz oben" | sed '1i\
Zeile wirklich ganz oben\
\
\
\
'
Zeile wirklich ganz oben




Zeile ganz oben
chrisbra@home~ %
#v-


regards,
Christian

Günter Schulze

unread,
May 19, 2012, 11:54:59 AM5/19/12
to
Hallo Helmut,

mal eine ganz anderes Prinzip:


~$ mkdir zeile_oben

~$ cd zeile_oben

~/zeile_oben$ echo "Vorhanden Zeile 1" > vorhanden.txt

~/zeile_oben$ echo "Vorhanden Zeile 2" >> vorhanden.txt

~/zeile_oben$ echo "Vorhanden Zeile 3" >> vorhanden.txt

~/zeile_oben$ cat vorhanden.txt
Vorhanden Zeile 1
Vorhanden Zeile 2
Vorhanden Zeile 3

~/zeile_oben$ echo "Zeile ganz oben" > oben.txt

~/zeile_oben$ cat oben.txt
Zeile ganz oben

~/zeile_oben$ cat vorhanden.txt > /tmp/vorh.txt

~/zeile_oben$ cat oben.txt > /tmp/oben.txt

~/zeile_oben$ ls -l /tmp/*.txt
-rw-rw-r-- 1 gsd gsd 16 19. Mai 17:43 /tmp/oben.txt
-rw-rw-r-- 1 gsd gsd 54 19. Mai 17:42 /tmp/vorh.txt

~/zeile_oben$ cat /tmp/oben.txt /tmp/vorh.txt > vorhanden.txt

~/zeile_oben$ cat vorhanden.txt
Zeile ganz oben
Vorhanden Zeile 1
Vorhanden Zeile 2
Vorhanden Zeile 3

~/zeile_oben$

Ein Skript lässt sich auch erstellen.

Viele Grüße
Günter
Message has been deleted

Bernd Hohmann

unread,
May 19, 2012, 7:42:25 PM5/19/12
to
Am 19.05.2012 17:54, schrieb Günter Schulze:

> mal eine ganz anderes Prinzip:

Ich hab das Problem auch so recht nicht verstanden - wenn 'sed' hier ein
Problem ist, dann macht man es halt ohne das Tool.

Zb. durch zeilenweise Auslesen der Orginaldatei, schreiben in eine
Temp-Datei, Einfügen an der passenden Stelle und zum Schluss die
temporäre Datei umzubenennen.

Pattern:

cat $file | while read line; do
echo "$line<br>"
done

Bernd

Sven Mascheck

unread,
May 19, 2012, 7:42:24 PM5/19/12
to
G�nter Schulze wrote:

> ~/zeile_oben$ cat /tmp/oben.txt /tmp/vorh.txt > vorhanden.txt

Guter, einfacher Ansatz (in diesem speziellen Fall),
und nebenbei ein "useful use of cat",
fehlt m.M. nach nur noch der Feinschliff:

(printf 'Zeile ganz oben\n'; cat datei.txt) > ergaenzt.txt

oder

... | (printf 'Zeile ganz oben\n'; cat -) | ...


PS: Statt echo mit Options: printf ist einfacher und verbreiteter.

Juergen P. Meier

unread,
May 20, 2012, 1:06:04 AM5/20/12
to
Helmut Schneider <jump...@gmx.de>:
>> >> $ echo "Zeile ganz oben" | sed '1i\
>> >> Zeile ganz oben
>> >> '
>> >
>> > Das ist leider alles andere als portabel.
>>
>> Was bitteschᅵn ist daran nicht portabel?

Der Linefeed. Verschiedene sed reagieren subtil anders darauf.

> Stimmt, portable war nicht das Problem.

Probier es doch mal mit verschiedenen sed implementierungen aus.

> [helmut@BSDHelmut ~]$ echo "Zeile ganz oben" | sed '1i\
> Zeile ganz oben
>
>
>
>
> '
> Zeile ganz oben
> Zeile ganz oben
> [helmut@BSDHelmut ~]$
>
> Das war das Problem...
>
> Als "Workaround" hatte ich dann gefunden:
>
> echo "one,two,three" | sed "s/,/\\`echo -e '\n\r'`/g"

echo -e?

Also wenn du schon Toolchest-Proprietaer programmierst, dann kannst du
auch GNU sed in ganz bestimmten Versionen nutzen, die kennen dann \n
Nativ als Zeilenvorschubzeichencode (anstatt es als Literal 'n' zu
interpretieren - wie alle anderen sed-Implementierungen sowie einige
Versionen von GNU sed) interpretiert wird.

> Aber dann kam wieder die dash:
>
> $ echo "one,two,three" | sed "s/,/\\`echo -e '\n\r'`/g"
> sed: -e expression #1, char 8: unterminated `s' command
> $

Ach.

'echo' ist idR nunmal ein Shell-Builtin und du darfst hoechstens mit
UNIX Standardkonformitaet rechnen, was die Optionen angeht.

Aber sed ist ja uach nicht das geeignete Werkzeug, um Mehrzeilige
Operationen an Texten zu machen.

Juergen
--
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Martin Vaeth

unread,
May 20, 2012, 2:44:59 AM5/20/12
to
Sven Mascheck <masc...@email.invalid> wrote:
> fehlt m.M. nach nur noch der Feinschliff:
>
> (printf 'Zeile ganz oben\n'; cat datei.txt) > ergaenzt.txt

Wenn schon Feinschliff, dann richtig: Es ist nicht unbedingt
notwendig, eine Subshell zu starten.
Gegen ev. Probleme im Text und Dateinamen kann man auch vorsorgen:

{ printf '%s\n' 'Zeile ganz oben'
cat -- 'datei.txt'
} > 'ergaenzt.txt'

Ob man meherere Zeilen oder eine mit ";" statt obiger 2 Zeilenenden
benutzt, ist wohl Geschmackssache; ich habe allerdings bei "antiken"
Shells von Problemen mit ";" bei seltenenen Spezialfällen gehört -
im Zweifelsfalls sind mehrere Zeilen also wohl vorzuziehen.

Helmut Schneider

unread,
May 20, 2012, 6:25:50 AM5/20/12
to
Günter Schulze wrote:

> mal eine ganz anderes Prinzip:

[Viele Dateien erstellen und hin- und herkopieren/cat'en]

Mein Skript sieht derzeit so ähnlich aus. Ich find's hässlich und
unleserlich. Ebenso das manuelle newline mit sed, man gibt sich viel
Mühe durch eintsprechendes Einrücken und macht dann damit alles wieder
kaputt.

Mein Problem ist also weniger technisch, als ästetisch.

David Haller

unread,
May 20, 2012, 6:27:03 AM5/20/12
to
On Sun, 20 May 2012 07:05:40, Juergen P. Meier <nospa...@jors.net> wrote:
> Helmut Schneider <jump...@gmx.de>:
>>> >> $ echo "Zeile ganz oben" | sed '1i\
>>> >> Zeile ganz oben
>>> >> '
>>> >
>>> > Das ist leider alles andere als portabel.
>>>
>>> Was bitteschᅵn ist daran nicht portabel?
>
> Der Linefeed. Verschiedene sed reagieren subtil anders darauf.

1. -v bitte
2. welcher der Linefeeds?

-dnh

--
I didn't know it was impossible when I did it.

Sven Mascheck

unread,
May 20, 2012, 1:51:14 PM5/20/12
to
Martin Vaeth wrote:

> Ob man meherere Zeilen oder eine mit ";" statt obiger 2 Zeilenenden
> benutzt, ist wohl Geschmackssache; ich habe allerdings bei "antiken"
> Shells von Problemen mit ";" bei seltenenen Spezialf�llen geh�rt -
> im Zweifelsfalls sind mehrere Zeilen also wohl vorzuziehen.

Hast Du dazu noch irgendwelche weiteren Hinweise?

Ottmar Cartellieri

unread,
May 21, 2012, 12:45:56 AM5/21/12
to
2012/05/20 10:25:50 GMT Helmut Schneider (jump...@gmx.de)
[Zeile am Dateianfang einfügen]

Äh, hrm, so ganz verstanden hab ich noch nicht, warum sed bemüht wird.

So etwas wie

XY=`date`; (echo $XY; cat MeineDatei) > TmpDatei; mv TmpDatei MeineDatei

leistet nicht das gewünschte?


Wenn die TmpDatei unerwünscht ist, mach es mit einem here document und
ex oder ed:

vari=`date` ; ed MeineDatei << Snoopy
1i
12345 $vari qwerty
New Line Goes Here
.
w
q
Snoopy

Der gute alte ed ist nicht so geschwätzig wie ex ;)

Vielleicht hilft's

oc

Martin Vaeth

unread,
May 21, 2012, 1:16:28 AM5/21/12
to
Sven Mascheck <masc...@email.invalid> wrote:
> Martin Vaeth wrote:
>
>> Ob man meherere Zeilen oder eine mit ";" statt obiger 2 Zeilenenden
>> benutzt, ist wohl Geschmackssache; ich habe allerdings bei "antiken"
>> Shells von Problemen mit ";" bei seltenenen Spezialfällen gehört -
>> im Zweifelsfalls sind mehrere Zeilen also wohl vorzuziehen.
>
> Hast Du dazu noch irgendwelche weiteren Hinweise?

Ich kann mich nicht mehr genau erinnern. Ich glaube, es gab
mal irgendwelche Probleme mit for ...; do und geändertem IFS.
In Texten über autotools habe ich auch mehrmals von Problemen
mit Semicolon gelesen.
Auf die Schnelle habe ich jetzt nur diese Referenz gefunden,
die aber auch auf vieles andere hindeuten kann (etwa, dass
die Expansion von AC_DEFINE u.U. mit einem Semicolon enden kann,
auch wenn ich keinen Grund sehe, weshalb es das tun solle):

: Due to the syntactical bizarreness of the Bourne shell, do not use
: semicolons to separate AC_DEFINE or AC_DEFINE_UNQUOTED calls from
: other macro calls or shell code; that can cause syntax errors in the
: resulting configure script. Use either spaces or newlines.

Helmut Schneider

unread,
May 21, 2012, 6:23:42 AM5/21/12
to
Ottmar Cartellieri wrote:

> 2012/05/20 10:25:50 GMT Helmut Schneider (jump...@gmx.de)
>
> > Günter Schulze wrote:
> >
> > > mal eine ganz anderes Prinzip:
> >
> > [Viele Dateien erstellen und hin- und herkopieren/cat'en]
> >
> > Mein Skript sieht derzeit so ähnlich aus. Ich find's hässlich und
> > unleserlich. Ebenso das manuelle newline mit sed, man gibt sich viel
> > Mühe durch eintsprechendes Einrücken und macht dann damit alles
> > wieder kaputt.
> >
> > Mein Problem ist also weniger technisch, als ästetisch.
>
> [Zeile am Dateianfang einfügen]
>
> Äh, hrm, so ganz verstanden hab ich noch nicht, warum sed bemüht wird.
>
> So etwas wie
>
> XY=`date`; (echo $XY; cat MeineDatei) > TmpDatei; mv TmpDatei
> MeineDatei
>
> leistet nicht das gewünschte?

Doch, doch, aber da das ein paar mal passiert (auch mal an der 3ten
oder 5ten Stelle), hab ich für mein Empfinden zu viele TMP Dateien.

> Wenn die TmpDatei unerwünscht ist, mach es mit einem here document und
> ex oder ed:
>
> vari=`date` ; ed MeineDatei << Snoopy
> 1i
> 12345 $vari qwerty
> New Line Goes Here
> .
> w
> q
> Snoopy

Das ist wieder das Thema mit dem Einrücken. Klappt super, ja, aber ich
find's halt nicht hübsch. Ich geb mir immer viel Mühe, mir meine
Skripten leserlich zu halten, da bin ich eitel. :)

Sven Mascheck

unread,
May 21, 2012, 3:29:19 PM5/21/12
to
Martin Vaeth wrote:
> Sven Mascheck wrote:
>> Martin Vaeth wrote:
>>
>>> Ob man meherere Zeilen oder eine mit ";" statt obiger 2 Zeilenenden
>>> benutzt, ist wohl Geschmackssache; ich habe allerdings bei "antiken"
>>> Shells von Problemen mit ";" bei seltenenen Spezialfällen gehört -
>>> im Zweifelsfalls sind mehrere Zeilen also wohl vorzuziehen.
>>
>> Hast Du dazu noch irgendwelche weiteren Hinweise?
>
> Ich kann mich nicht mehr genau erinnern. Ich glaube, es gab
> mal irgendwelche Probleme mit for ...; do und geändertem IFS.

Ok, Danke für die Mühe - mag ja nur bedingt relevant sein, aber ich
bin extrem neugierig.

Hm, das triggert bei mir nur zwei Dinge, speziell im Zshg. mit
traditionellen Bourne shells, die mir aber auch nicht das scheinen,
was Du meinst,

- "for i; do" wird nicht akzeptiert, "for i <nl> do" aber schon.

- "set -e" muß am Ende einer Zeile auftauchen, da es erst
ab der folgenden Zeile wirkt. (Wer "set -e" einsetzt, muß sich aber
sowieso - shellübergreifend - auf sehr vermintes Gelände einrichten.)


> In Texten über autotools habe ich auch mehrmals von Problemen
> mit Semicolon gelesen. [...]

Ok, das alles wäre dann nur bei Verwendung der Skripte durch
GNU auto* relevant?

Martin Vaeth

unread,
May 21, 2012, 3:47:31 PM5/21/12
to
Sven Mascheck <masc...@email.invalid> wrote:
>
> - "for i; do" wird nicht akzeptiert, "for i <nl> do" aber schon.

Das war es vermutlich, an was ich mich dunkel erinnerte.
Ich wusste nicht, dass das ausschließlich bei Weglassen des "in"
relevant ist.
Ein Problem ist es auf alle Fälle, da es bedeutet, dass man
es z.B. in Makefiles nicht verwenden kann (wo man naturgemäß
keine Newlines an die Shell übergeben kann).

>> In Texten über autotools habe ich auch mehrmals von Problemen
>> mit Semicolon gelesen. [...]
>
> Ok, das alles wäre dann nur bei Verwendung der Skripte durch
> GNU auto* relevant?

Nicht unbedingt: Alle guten Texte über autotools enthalten auch
sehr viele Bemerkungen über Kompatibilität mit "historischen"
Shells.

Ottmar Cartellieri

unread,
May 22, 2012, 12:55:11 PM5/22/12
to
2012/05/21 10:23:42 GMT Helmut Schneider (jump...@gmx.de)

> Ottmar Cartellieri wrote:

> > [Zeile am Dateianfang einfügen]

> > So etwas wie
> >
> > XY=`date`; (echo $XY; cat MeineDatei) > TmpDatei; mv TmpDatei
> > MeineDatei
> >
> > leistet nicht das gewünschte?
>
> Doch, doch, aber da das ein paar mal passiert (auch mal an der 3ten
> oder 5ten Stelle), hab ich für mein Empfinden zu viele TMP Dateien.

Naja, es wird zwar jedes Mal eine TmpDatei erzeugt, aber auch gleich
wieder aufgeräumt.

Achso, nach beliebiger Zeile einfügen. Da kann man ja auch mal awk eine
Chance geben.
Wenn die Stellen, an denen eingefügt werden soll, gesammelt zur
Verfügung stehen, wäre

X=3
Z=14
T=\"Salade\"
U=\"Nicoise\"
cat testfile \
| awk "{print
if(NR==$X)print$T
if(NR==$Z)print$U}"

einen Versuch wert.

[here document]

> Das ist wieder das Thema mit dem Einrücken. Klappt super, ja, aber ich
> find's halt nicht hübsch. Ich geb mir immer viel Mühe, mir meine
> Skripten leserlich zu halten, da bin ich eitel. :)

Das würde ich jetzt nicht eitel nennen. Scripte mit einer klaren
Gliederung, die sich _auch_ im Layout widerspiegelt, sollen dem
Hörensagen nach von Vorteil im Hinblick auf die Wartbarkeit sein. ;)

Vielleicht hilft es ja diesmal

oc

Helmut Schneider

unread,
May 22, 2012, 7:40:34 PM5/22/12
to
Ottmar Cartellieri wrote:

> Achso, nach beliebiger Zeile einfügen. Da kann man ja auch mal awk
> eine Chance geben.
> Wenn die Stellen, an denen eingefügt werden soll, gesammelt zur
> Verfügung stehen, wäre
>
> X=3
> Z=14
> T=\"Salade\"
> U=\"Nicoise\"
> cat testfile \
> > awk "{print
> if(NR==$X)print$T
> if(NR==$Z)print$U}"
>
> einen Versuch wert.

Ich hatte awk schonmal versucht, aber es nicht hinbekommen, Variablen
auszugeben. Hatte folgenden Schnipsel gefunden:

awk 'NR==1{print "first line"}1' ./test.sh

Hab's dann erfolglos damit versucht

line="first line"; awk 'NR==1{print $'$line'}1' ./test.sh

awk erschliesst sich mir einfach nicht, ich schaff ich ja nichtmal,
Deinen awk Schnipsel in eine einzige Zeile zu packen.

Ottmar Cartellieri

unread,
May 23, 2012, 12:33:22 AM5/23/12
to
2012/05/22 23:40:34 GMT Helmut Schneider (jump...@gmx.de)

> Ottmar Cartellieri wrote:
>
> > Achso, nach beliebiger Zeile einfügen. Da kann man ja auch mal awk
> > eine Chance geben.
> > Wenn die Stellen, an denen eingefügt werden soll, gesammelt zur
> > Verfügung stehen, wäre
> >
> > X=3
> > Z=14
> > T=\"Salade\"
> > U=\"Nicoise\"
> > cat testfile \
> > > awk "{print

^
#&$%§*! - Da hat XanaNews das Pipe-Symbol für ein Zitatzeichen gehalten
und durch ein Größer-Zeichen ersetzt.

> > if(NR==$X)print$T
> > if(NR==$Z)print$U}"
> >
> > einen Versuch wert.
>
> Ich hatte awk schonmal versucht, aber es nicht hinbekommen, Variablen
> auszugeben. Hatte folgenden Schnipsel gefunden:
>
> awk 'NR==1{print "first line"}1' ./test.sh
>
> Hab's dann erfolglos damit versucht
>
> line="first line"; awk 'NR==1{print $'$line'}1' ./test.sh

Lost in the jungle of quoting ;))
Sieht hypsch aus, aber die sh zerdeppert das.

> awk erschliesst sich mir einfach nicht, ich schaff ich ja nichtmal,
> Deinen awk Schnipsel in eine einzige Zeile zu packen.

Wie auch, wenn das Zeux verstümmelt ankommt.

cat testfile | awk "{if(NR==$X)print$T; if(NR==$Z)print$U; print}"

Ähem, das print zur Ausgabe der Zeile muss natürlich _nach_ den
if-Abfragen stehen, damit man auch *vor* der ersten Zeile Text einfügen
kann.

keep on hacking

oc

Helmut Schneider

unread,
May 23, 2012, 6:35:29 AM5/23/12
to
Ottmar Cartellieri wrote:

> 2012/05/22 23:40:34 GMT Helmut Schneider (jump...@gmx.de)
>
> > Ottmar Cartellieri wrote:
> >
> > > Achso, nach beliebiger Zeile einfügen. Da kann man ja auch mal awk
> > > eine Chance geben.
> > > Wenn die Stellen, an denen eingefügt werden soll, gesammelt zur
> > > Verfügung stehen, wäre
> > >
> > > X=3
> > > Z=14
> > > T=\"Salade\"
> > > U=\"Nicoise\"
> > > cat testfile \
> > > > awk "{print
>
> ^
> #&$%§*! - Da hat XanaNews das Pipe-Symbol für ein Zitatzeichen
> gehalten und durch ein Größer-Zeichen ersetzt.

Das war mir schon klar, daran liegt es nicht.

> > awk erschliesst sich mir einfach nicht, ich schaff ich ja nichtmal,
> > Deinen awk Schnipsel in eine einzige Zeile zu packen.
>
> Wie auch, wenn das Zeux verstümmelt ankommt.
>
> cat testfile | awk "{if(NR==$X)print$T; if(NR==$Z)print$U; print}"
>
> Ähem, das print zur Ausgabe der Zeile muss natürlich nach den
> if-Abfragen stehen, damit man auch vor der ersten Zeile Text einfügen
> kann.

OK, hab's, hatte die Anführungszeichen nicht gequoted! Super! Genau was
ich gesucht hab, Merci!

Helmut Schellong

unread,
Jun 7, 2012, 7:11:19 AM6/7/12
to
Das ist ein Standardproblem für mich, für das
ich folgendes Skript parat halte:

cat "$file" | {
>"$file"
while readl Z
do
catv Z /%n
expr "$Z" :: "$RA" || continue
catv addzeilen /%n
done
><
}

Die verwendete Shell ist allerdings keine übliche Shell!

readl liest aus |, der kopierten Ursprungsdatei, deren
Inhalt in Zeile 2 gelöscht wird.
readl entfernt den Zeilenvorschub.
Wenn der Reguläre Ausdruck in RA paßt, wird zusätzlich
addzeilen ausgegeben.
In Standardeinstellung ist | eine _echte_ Datei (in /tmp),
also keine Pipe im RAM.
Man kann hier auch echo oder print statt catv verwenden.



--
Mit freundlichen Grüßen
Helmut Schellong v...@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
0 new messages