PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sed/ Stringverarbeit.-Problem



codefritz
05-12-2008, 17:45
In einer Datei befinden sich in jeder Zeile zwei Strings mit einem Leerzeichen getrennt. Jede Zeile stellt dabei ein bash Kommando dar und soll nach Veränderung des ersten Strings der Zeile ausgefuehrt werden.

/tmp/var dest1
/tmp/log dest2
/tmp/xy destxy

Daraus sollen schliesslich folgende Befehle erzeugt und an die bash uebergeben werden:

cp $PREFIX/tmp/var dest1
cp $PREFIX/tmp/log dest2
cp $PREFIX/tmp/xy dest3

BLUESCREEN3D
05-12-2008, 18:38
Wenn das ein Shellscript werden soll, brauchst du kein sed, sondern kannst "read" benutzen, um die Strings in Variablen einzulesen und damit zu arbeiten.

Ansonsten mit sed: Ersetze jeden Zeilenanfang "^" durch "cp $PREFIX".

codefritz
06-12-2008, 14:07
besten Danke Bluescreen. Is ja eig. so easy dass ich da nicht selbst daraufgekommen bin.

Die neuen Strings stellen ja dann ein bash-commando dar.
e.g.
Wie kann ich die dann am besten zur Ausführung bringen?

sed koennte die neuen String ja zB in eine Datei schreiben, die koennte ich dann einfach als Skript ausfuehren also aufrufen.
Alternativ die Kommandos auslesen und mit der Funktion eval ausfuehren? Wie erfolgt hier aber dann das Auslesen und aufrufen am besten? Muessten ja in einer Variable gespeichert und diese dann durchlaufen werden... hm kann mir aber gerade nicht vorstellen wie das am besten zu realisieren ist.

Mit for i in VAR kann eine Variable durlaufen werden, allerdings ist wohl in meinem Fall schwierig erstmal die Variable (VAR) zu fuellen und dann zwischen den kommandos zu untersscheiden, da diese ja Leerzeichen enthalten...

BLUESCREEN3D
07-12-2008, 13:45
sed koennte die neuen String ja zB in eine Datei schreiben

Danach:

source dateiname

jan61
08-12-2008, 18:49
Moin,


...Wie kann ich die dann am besten zur Ausführung bringen?

Indem Du die Ausgabe einfach einer Shell übergibst - die kann nämlich auch von stdin lesen:

sed "s/^/cp $PREFIX/" datei | shJan

EDIT: Wenn $PREFIX Slashes enthält, dann besser so:

sed "s|^|cp $PREFIX|" datei | sh
# oder
export PREFIX
sed 's/^/cp $PREFIX/' datei | shIn der ersten Version wird $PREFIX bereits im sed durch seinen Inhalt ersetzt (deshalb nimmt man als Delimiter die Pipe), im 2. Beispiel wird $PREFIX als Zeichenkette an sh übergeben, die dann die Ersetzung durchführt. Deshalb auch der export vorneweg, die sh hinter der Pipe wird nämlich in einer Subshell ausgeführt (wenn Du bash benutzt).