SED Variable

tiptel170

Tripel-As
Beiträge
166
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
 

marce

Kaiser
Beiträge
1.298
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...
 

tiptel170

Tripel-As
Beiträge
166
Es soll mir am Ende in einer Textzeile eine Variable von einer anderen Datei eingefügt werden.
 

Spröde

Alter Sack
Beiträge
177
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.
 

tiptel170

Tripel-As
Beiträge
166
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
 
G

Gast123

Gast
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?
 

tiptel170

Tripel-As
Beiträge
166
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
 

tgruene

Routinier
Beiträge
418
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.
 

marce

Kaiser
Beiträge
1.298
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.
 

Spröde

Alter Sack
Beiträge
177
So sieht es aus.

Mir scheint, hier will jemand den sed-Befehl insert an der falschen Stelle benutzen.
 

tiptel170

Tripel-As
Beiträge
166
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?
 

zst

Foren As
Beiträge
95
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
 

tiptel170

Tripel-As
Beiträge
166
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:

tiptel170

Tripel-As
Beiträge
166
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
 

floyd62

Routinier
Beiträge
324
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.
 

Ä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?)

Sucheingaben

sed variables

,

variable sed unknown command

Neueste Themen

Oben