Forum: PC-Programmierung Unix SED Rätsel


von Stefan S. (Gast)


Lesenswert?

Also ich Rätsel jetzt schon weit über eine Stunde...
Ich wollte nur einen kurzen Textblock am Beginn einer Textdatei 
einfügen. Hätte man natürlich mit cat machen können, mit einer 
temporären Datei. Mach ich jetzt auch -- bzw. morgen.

Aber da ich eh sed verwende, dachte ich, ich mache es mal damit.
Hier ein Test (hhh.txt ist die vorhandene Datei, xxx.yyy das Bash-Script 
und i die Variable). Der erste Versuch, der meiner Meinung nach 
funktionieren sollte, bringt eine Fehlermeldung, der zweite geht dann 
seltsamer weise, obwohl das eher unsinnig ist.
1
stefan@AMD64X2 ~/workdirgtk3 $ cat hhh.txt 
2
Text in Datei
3
hhh.txt schon vorhanden.
4
stefan@AMD64X2 ~/workdirgtk3 $ cat xxx.yyy 
5
i='line1
6
line2
7
line3'
8
9
echo "$i"
10
11
sed  -e "1i$i" hhh.txt
12
13
echo '---'
14
15
i='line1\
16
line2\
17
line3'
18
19
echo "$i"
20
21
sed  -e "1i$i" hhh.txt
22
23
stefan@AMD64X2 ~/workdirgtk3 $ bash xxx.yyy 
24
line1
25
line2
26
line3
27
sed: -e expression #1, char 10: extra characters after command
28
---
29
line1\
30
line2\
31
line3
32
line1
33
line2
34
line3
35
Text in Datei
36
hhh.txt schon vorhanden.
37
stefan@AMD64X2 ~/workdirgtk3 $

von Yalu X. (yalu) (Moderator)


Lesenswert?

Stefan S. schrieb:
> der zweite geht dann seltsamer weise, obwohl das eher unsinnig ist.

So wie in deinem zweiten Beispiel ist es aber richtig :)

Aus dem Sed-Manual:

  "Immediately output the lines of text which follow this command (each
  but the last ending with a \, which are removed from the output)."

Mit einem  Backslash (Fortsetzungszeichen) am Zeilenende teilst du Sed
mit, dass auch die darauffolgende Zeile noch zum gleichen Kommando (in
diesem Fall "i") gehört. In deinem ersten Beispiel wird jedoch "line2"
als neues Kommando interpretiert, da es in einer eigenen Zeile steht und
nicht mit einem Backslash an die vorangegangene Zeile ("liline1")
angeschlossen wird. Auf das "l"-Kommando darf aber höchstens eine Zahl
folgen, hier sieht Sed aber stattdessen die Zeichenfolge "ine2", was zu
einer Fehlermeldung führt.

: Bearbeitet durch Moderator
von Stefan Salewski (Gast)


Lesenswert?

Danke für die Erklärung, so klingt das sogar einleuchtend :-).
Ich hatte es gestern nur mit 'man sed' versucht, da ist dein zitierter 
Text nicht enthalten. Wird wohl nur mit 'info sed' angezeigt, wobei ich 
mit info leider nicht gut zurecht komme, muss ich wohl auch mal lernen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Stefan Salewski schrieb:
> Ich hatte es gestern nur mit 'man sed' versucht, da ist dein zitierter
> Text nicht enthalten.

Ich hab's von hier:

  http://www.gnu.org/software/sed/manual/sed.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.