SED Variable

T

tiptel170

Tripel-As
Guten Abend,

ich habe ein Problem mit SED. Es wird die Variable nicht in den Test eingefügt.

Hier die Anweisung:
Code:
sed -e 's/$/ = '"i/$zahl"'/'

Bekomme folgenden Fehler:
Code:
sed: -e expression #1, char 15: unknown command: `
'

Vielleicht kann mir jemand Helfen?

Gruß tiptel170
 
was willst Du denn erreichen bzw. wie sieht's aus und wie soll's hinterher aussehen? Aus dem Ausdruck hier werde ich zumindest nicht schlau...
 
Es soll mir am Ende in einer Textzeile eine Variable von einer anderen Datei eingefügt werden.
 
Vier Slashe sind jedenfalls eins zu viel. Escape ein Slash:
Code:
sed -e 's/$/ = '"i\/$zahl"'/'

oder wähle ein anderes Zeichen als Trenner, je nachdem, was Du da vorhast.
 
Hallo Spröde,

hab gerade den Vorschlag von getestet. Nun bekomme ich diesen Fehler:

Code:
sed: -e expression #1, char 12: unterminated `s' command

Gruß tiptel170
 
Zur Ausgangsfrage:
Die Shell-Variable $zahl wird nicht aufgelößt, da du das Sed-Statement in Hokommata (') und nicht in Gänsefüßchen (") gesetzt hast.
Code:
sed -e "s/$/ = i/$zahl/"
könntest du gemeint haben?
 
Hallo Schard,

das was du geschrieben hast, habe ich auch schon probiert.
Bekomme diesen Fehler:

Code:
sed: -e expression #1, char 15: unknown command: `
'

Nun habe ich was ausprobiert:

Code:
sed -e 's/$/ = 'i\/$zahl'/'

mit dem Erfolg:
Code:
sed: can't read 43: No such file or directory

Die Zahl 43 wurde aus der Variable ausgelesen und auch eingefügt.
Gruß tiptel170
 
Dein Befehl wird erst von der Shell interpretiert, bevor dann an sed weitergegeben wird. Bei bash (und vermutlich den meisten anderen Shells) wird der Inhalt von einfachen Hochkommate (') nicht interpretiert, nur von doppelten ("). Deswegen wird bei Deinem ersten Versuch $zahl nicht durch den Wert ersetzt, den Du mit der Shell gesetzt hast.
Ausserdem werden Hochkommata als 'von-bis' interpretiert, nicht von aussen nach innen. Daher sieht sed bei Deinem letzten Versuch
Code:
sed -e 's/$/ = 'i\/$zahl'/'
den Befehl
Code:
s/$/ =
uns soll den auf die Daten
Code:
i\/$zahl
anwenden. Was sed mit dem Rest macht, weiss ich nicht, aber bis dahin ist es ja schon einiges Kuddelmuddel. Wenn Du bei dem Vorschlag von Schard das '/' nach dem 'i' noch mit einem escape versiehst, so wie in Deinem letzten Versuch, sollte es klappen.
 
mich würde ja immer noch als konkretes Beispiel interessieren, was er denn konkret erreichen will - sprich Input -> Output.

Solange das nicht gegeben ist raten wir doch eh nur rum und treffen das Gewünschte eher aus Zufall - die textuelle Beschreibung aus #3 ist nämlich alles andere als eindeutig.
 
So sieht es aus.

Mir scheint, hier will jemand den sed-Befehl insert an der falschen Stelle benutzen.
 
Meine Idee war es mit SED die /etc/isdn/callerid.conf auszulesen und die NUMBER zu dem ALIAS zu zu Ordnen.

Code:
[MSN]                                                                                                                                                                                                                                        
 NUMBER    = 40                                                                                                                                                                                                                              
 SI        = 1                   # Info                                                                                                                                                                                                      
 ZONE      = 0                                                                                                                                                                                                                               
 ALIAS     = Info

So sieht es in der Datei aus. Mein Problem ist, es gib viele Sektionen die mit [MSN] anfangen. Daher war mein Gedanke, mittels cat und grep die Datei auszulesen.
Code:
cat /etc/isdn/callerid.conf | grep NUMBER | grep -v "#" > /tmp/isdnnr
cat /etc/isdn/callerid.conf | grep ALIAS | grep -v "#" > /tmp/isdnali

Somit habe ich zwei Dateien. Mittels einer for-Schlaufe wollte ich die Datei isdnnr in die isdnali am Anfang oder am Ende jeder Zeile einfügen. Denn beide Dateien haben immer die gleiche Anzahl von den Zeilen.
Vielleicht gib es einen anderen Weg?
 
Nachdem Du nun mal etwas konkreter geworden bist, hier mal ein Vorschlag OHNE sed:

Code:
#!/bin/bash
NUM=$(grep NUMBER callerid.conf | grep -v "#" | cut -d "=" -f2)
ALI=$(grep ALIAS callerid.conf | grep -v "#" | cut -d "=" -f2)
echo "ALIAS =$ALI und NUMBER =$NUM"
###echo "ALIAS =$ALI und NUMBER =$NUM" > /tmp/isdnali

Ausgabe wäre dann:
Code:
ALIAS = Info und NUMBER = 40
 
Danke für Eure Mithilfe und Einsatz!
Nun habe ich eine Lösung für das Problem gefunden, die will ich auch nicht vorenthalten:
Code:
cat /etc/isdn/callerid.conf | grep -v "#" | sed '/SI.*/d' |cut -d "=" -f 2 | sed '/\//d ; /\[/d ; /{/d ; /}/d ; s/^[ \t]*//; /^0.*/d; /^$/d; /^4/i;' | tr '\n' '=' | sed 's/=;=/$/g' | tr '$' '\n' | sed -e 's/;=//g; s/=/_=_/g ; s/ _=_//g; s/_=_/ = /g'

Bessere Version:
Code:
 cat /etc/isdn/callerid.conf | grep -v "#" | sed '/SI.*/d ; /ZONE.*/d ; /USER.*/d ; /GROUP.*/d' | cut -d "=" -f 2 | sed '/\//d ; /\[/d ; /{/d ; /}/d ; s/^[ \t]*//; s/^$/;/g' | tr '\n' '=' | sed 's/=;/~/g' | tr '~' '\n' | sed '/^$/d ; s/=/ = /g ; s/^ = //g ; /;/g'

Die Ausgabe sollte, dann so aussehen:
Code:
40 = Info                                                                                                                                                                                                                                    
43 = Eltern                                                                                                                                                                                                                             
49 = Praxis                                                                                                                                                                                                                           
48 = 3.MSN Fax                                                                                                                                                                                                                        
45 = InfoDJf4h                                                                                                                                                                                                                               
42 = InfoPrivat

Gruß tiptel170
 
Zuletzt bearbeitet:
mach doch noch ein | grep . | sort dahinter...
 
Was macht " | grep . | sort " noch? Ich habe gesehen, dass mir dann die erste Leerzeile entfernt wird. Diese Leerzeile wollte ich aus der Datei weg haben. Hat mich gestört.

Gruß tiptel170
 
Hi tiptel170,

"grep ." sucht einfach nach Zeilen, die (mindestens) ein Zeichen enthalten, eliminiert also die Leerzeilen, und "sort" sortiert die Ausgabe. Ggf. wäre "sort -n" noch interessant, um nach den Telefonnummern zu sortieren (falls die nicht sowieso alle zweistellig sein sollten).

Nur als Ergänzung: wenn wir annehmen können, dass in der Eingabedatei "callerid.conf"

- uns nur die Einträge für NUMBER und ALIAS interessieren,
- alles andere also ignoriert werden kann, und
- diese Zeilen auch immer schön abwechselnd und in genau dieser Reihenfolge auftauchen,

dann könnte ein kleines awk-Skript, wie etwa

Code:
awk '
        $1 == "NUMBER" { number = $3; }
        $1 == "ALIAS" { print number, " = ", $3; }
'

oder, wenn es dann doch sed sein soll, ein Einzeiler wie

Code:
sed -n -e 's/^ *NUMBER.*= *//; tx; s/^ *ALIAS  *=/=/; ty; d; :x h; d; :y H; x; s/\n/ /g; /^./p; d;'

schon die Ausgabe liefern, die du haben wolltest.

Gruss,
A.
 
Danke für den Einzeiler :-) Darauf wäre ich nie gekommen.

Gruß tiptel170
 

Ähnliche Themen

sed - Bitte um Unterstützung

Hilfe für ein shell script

Textdatei filtern und löschen mit grep /sed

Keine grafische Oberfläche (Debian Installation)

Telefoninterview (Wie sich auf Bash-Shell-Fragen vorbereiten?)

Zurück
Oben