ForumBash Skripting
dracko – Freitag, 30. September 2005 14:02 Uhr

Hallo zusammen!!
Bin gerade dabei ein paar BASH Skripte zu schreiben und hänge an einem Problem fest.
Ich habe eine Datei in der pro Zeile ein Verzeichnissname steht. Es sind auch Verzeichnisse mit Leerzeichen dabei z.b. Mysql Datenbank
Diese Datei soll weiter verarbeitet werden, jedoch brauche ich in jeder Zeile am Anfang und am Ende ein ” !! Ich bin nun auf der Suche nach einer Möglichkeit die Datei dahingehend zu erweitern!! Hat jemand eine Idee wie es mit SED oder awk oder ähnlichem funktioneren kann?

Danke schon mal

Dracko

4 Antworten
Philipp Vogt – Freitag, 30. September 2005 14:34 Uhr

Hallo!

Eine Moeglichkeit mit Perl:

cat test.txt | perl -ne ‘chomp($_);print “\””.$_.”\”\n”;’

mfG

Philipp

Tommi Mäkitalo – Freitag, 30. September 2005 15:04 Uhr

na da haben wir mal wieder ein Fall “useless use of cat”. Stat “cat test.txt | blah” kannst Du: “blah

Philipp Vogt – Freitag, 30. September 2005 23:48 Uhr

Hallo!

“useless use of cat”. Kommt drauf an. Ich lese gern von links nach rechts. Bzw. wandern die Daten bei mir von links (cat) nach rechts (perl, dann meist noch ein “| less”). Und ich schreibe das auch gern in der Reihenfolge: mit cat mal schauen, ob die Datei bzw. deren Inhalt passt, dann erst der perl-Befehl basteln und da muss ich meist das Programm am Ende der Zeile anpassen, was am Besten geht, wenn nichts mehr folgt.

Ich bin eigentlich auch dagegen etwas nur in einer Zeile zu programmieren, aber leider heisst es Kommandozeile und nicht Kommandozeilen (kann man zwar in der bash auch irgendwie hinkriegen, ist aber etwas umstaendlich – bashhistory etc.).

Aber prinzipiell hast Du recht: man kann es auch kuerzer schreiben. Nur finde ich kurz auch nicht immer gut (darum hasse ich tlw. die C-Gurus: alles in eine Zeile quetschen was geht, auch wenn die Lesbarkeit leidet).

mfG

Philipp

Mathias Hoffmann – Freitag, 30. September 2005 14:52 Uhr

Hallo,
vielleicht hilft Dir scho das:

sed -e s/^/\”/ filex > filey
sed -e s/$/\”/ filey > filex

Irgendwie konnte man das auch zusammenfassen, z.B. als sed-script.
Komm aber gerade nicht drauf
Gruß
hmhweb

Tommi Mäkitalo – Freitag, 30. September 2005 15:07 Uhr

Übrigens das geht so:

sed -e ‘s/\(.*\)/”\1″/’

Ralf Beckesch – Freitag, 30. September 2005 16:59 Uhr

Hi, wenn ich das Problem richtig weiter gedacht habe, brauchst du die ” (Anführungszeichen), um die Verzeichnisse wieter in der Shel zu verarbeiten (zum Beispiel in einer Schleife). Da brauchst du dir denke ich keine Verrenkungen via sed oder awk einfallen lassen.

Dafür gibt es IFS, das ist die Shellvariable, die bestimmt, welches Zeichen Parameter, bzw in einer Schleife Elemente voneinander trennt. Per Default ist IFS nicht belegt, und die Bash nimmt als Default einfach Leerzeichen und TABs an. (siehe for i in a b c d e; do echo $i ; done)

Wenn du nun den Zeilenumbruch als Feldtrenner setzt, wird eine for Schleife über den Inhalt deiner Datei die einzelnen Zeilen als Laufvariable verwenden!

IFS=$’\n’
for i $(cat DATEI); do
echo $i
done
unset IFS

So könnte das Stück Code dazu aussehen. Wichtig ist es, irgendwann IFS wieder auf leer zu setzten, damit deine Shell wieder normal arbeitet!

Grüße,
Ralf

[1] http://wiki.ralf.beckesch.de/dev/bash-help#schleifen

Jan Kandziora – Samstag, 01. Oktober 2005 08:39 Uhr

for i $(cat DATEI); do Alternativ

for i $(

Thomas Seeling – Dienstag, 11. Oktober 2005 09:33 Uhr

Hallo,

ich mag sehr gern die Schreibweise

while read line
do
test -d “$line” && echo “dir: $line”
test -f “$line” && echo “fil: $line”
test -L “$line” && echo “lnk: $line”

done < datei Wenn es aber nur darum geht, die Filenamen weiterzuverarbeiten, muß und sollte man sich nicht die Mühe machen, sie mit "" zu umgeben. Die Shell kann wunderbar mit Variablen umgehen, deren Inhalt auch Leerzeichen enthält. Man muß nur darauf achten, daß man die Variable immer mit "" quotet, wenn man sie verwendet. Es ist ein Unterschied, ob die Variable oder der Inhalt die Quotes enthält! Meistens will man gerade nicht, daß der Inhalt sich ändert. Also immer brav "$i" schreiben, dann kommt die Shell auch nicht durcheinander. Interessant ist übrigens auch, daß aus historischen Gründen an einigen Stellen keine Quotes nötig sind, auch wenn eine Variable Leerzeichen enthält, z.B. bei den Positionsparametern $1..$9. #!/bin/sh # hier braucht man kein Quote, selbst beim Aufruf ./xxx "a b c" myarg1=$1 # hier aber schon, sonst sieht die sh mkdir a b c und nicht mkdir "a b c" mkdir "$myarg1" Wenn es unbedingt sein muß, kann man mit den üblichen regex-fähigen Tools die Quotes am Anfang und Ende dazubauen. x="$(echo "$x" | sed -e s/'^'/'\"'/ -e s/'$'/'\"'/)" oder x="\"$x\"" Ich bevorzuge die Variante, die keine Subshell+Pipe benötigt.