ubuntuusers.de

String innerhalb einer Variable editieren?

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

Unix_Samurai

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Hi.

Ich habe mit

dirname

einen reinen Ordnerpfad aus einem Dateipfad extrahiert und will nun diesen String leicht abändern, so dass im Grunde nur ein Wort ersetzt werden müsste. Mit sed könnte ich den String zwar in einer Datei manipulieren, aber das ist ja etwas umständlich. Geht es auch direkter?

MfG

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja, gibt es, als "Parameter Expansion": http://mywiki.wooledge.org/BashFAQ/073

Dazu muss der Pfad allerdings schon in einer Variablen vorliegen. Sonst kommt es doch wieder auf eine Pipe-Verkettung hinaus, und die geht am einfachsten mit sed.

Vielleicht wäre es hier eine gute Idee, auch die Funktion dirname durch eine "Parameter Expansion" ( ${dateipfad%.*} ) zu ersetzen ?

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

d=$(dirname $PWD/view.htm); echo ${d/stefan/pinguin}
/home/pinguin/Desktop

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Ich habe es nun doch mit sed und einer Datei gemacht. Expansions scheinen nicht das richtige zu sein.

MfG

Edit: zu spät gesehen Unknown. Trotzdem danke! Ich hab noch eine kleine Frage.

Und zwar will ich nun den Pfad direkt an mkdir übergeben, jedoch...

mkdir -p $(dirname $a)

funktioniert nicht, so wie ich es gerne hätte. Das mit den Klammern verwirrt immernoch. Gibt es da einen Oberbegriff unter dem man sich zu Klammern und Variablen informieren kann?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Im Zweifel steht das alles im Bash Manual, unter "Shell Expansions".

Und zum testen kannst Du ja mal ein echo davor setzen:

echo "mkdir -p $(dirname $a)"

Dann siehst Du ja was er genau gefüttert bekommt. Achte im Zweifel auch auf Leerzeichen z.B. in Pfadnamen. Denn dadurch kann ein Parameter $(dirname $a) versehentlich in zwei oder mehr zerfallen. Dagegen hilft "Quoting".

LG,

track

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Ich versuche nun dirname eine Variable zu übergeben. Aber ich bekomme auch

dirname $a

nicht zum laufen. Klammermöglichkeiten ging ich auch schon durch.

Wenn ich das habe, dann würde ich dies gerne einer Variable zu ordnen. ca so:

b=$(dirname $a)

Kann mir da jemand eine Lösung nennen? Es wäre sehr bedeutsam. Danke.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Unix Samurai schrieb:

Ich versuche nun dirname eine Variable zu übergeben. Aber ich bekomme auch

dirname $a

nicht zum laufen. Klammermöglichkeiten ging ich auch schon durch.

Was soll denn da laufen - das ist doch nur ein Kommando. ☺ Was funktioniert denn nicht? Ist das Ergebnis vielleicht ein Punkt oder zwei?

Wenn ich das habe, dann würde ich dies gerne einer Variable zu ordnen. ca so:

b=$(dirname $a)

Kann mir da jemand eine Lösung nennen? Es wäre sehr bedeutsam. Danke.

Ja, das ist richtig so - bzw. b=$(dirname "$a"), wenn $a Blanks u.ä. enthalten kann.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Unix Samurai schrieb:

bekomme … nicht zum laufen

Na, was passiert denn? Was gibt er denn aus? Hast du den Tipp von track mit dem echo mal probiert, um sicherzugehen, dass $a richtig gesetzt ist?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Was steht denn in der Variablen "$a" drin ?

Probier mal dies, mit Probe-Ausgaben:

echo "In a steht: [$a]"
echo "b=$(dirname $a)"
b=$(dirname $a)
echo "Ohne Quotes: [$b]"

echo "b=$(dirname "$a")"
b="$(dirname "$a")"
echo "In b steht dann: [$b]"

Beachte die Gänsefüßchen (= Quotes: ""), damit auch bei Leerzeichen im Text alles jeweils ein Parameter bleib !

track

edit: ☺ oha, alle 3 gleichzeitig das gleiche...

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Merkwürdig. Ich glaube ich bin grade in der Situation in der jeder Programmierer mal war: man könnte schwören, dass genau dieser Code gerade noch einen anderen Effekt hatte.

Entweder ich hab zu wenig Schlaf oder das Script, welches als Umgebung für

1
a=/ddd/dd.txt ; b=$(dirname $a) ; echo $b

diente, hat den Fehler verursacht.

Aber ich bleib beim ersten. Ich könnte schwören, dass der Code gerade noch etwas anderes ausgegeben hat*g*

Auf euch ist Verlass, sogar um die Uhrzeit. Wenn ich meine erste Million gemacht hab, bekommt ubuntuusers davon etwas zurück.

MfG

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Nun weiß ich den Fehler. dirname wurde tatsächlich ein Pfad mit Leerzeichen übergeben. Ich forsche nun, wie ich das auch mit Leerzeichen hinbekomme. Falls es jemand weiß, darf er es aber auch gerne posten.

MfG

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Hat track oben schon mal angesprochen. ☺

track schrieb:

Quoting

Sprich, so geht’s:

1
2
3
a="/tmp/foo bar/baz"
b=$(dirname "$a")
echo "$b"

(Die Anführungszeichen um $(...) bei der Zuweisung von $b sind optional. Der Verwirrung gibt es nie genug!)

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Ich hätte nun gedacht, dass die Quotes die Bedeutung von $ killen. Aber das ist wohl nur bei reg ex?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Öhm, das ist mir noch nicht untergekommen. Es sei denn, du meinst Escape-Zeichen Backslashes statt Quotes. 😈 (edit: Wie bin ich denn auf „Escape-Zeichen“ gekommen? 😕)

Nein, doppelte Anführungszeichen schützen bei Shellskripten „nur“ Sonderzeichen wie eben Leerzeichen oder auch den Stern beim Globbing. Variablen expandieren aber noch. Erst einfache Anführungszeichen übernehmen den Inhalt „wörtlich“:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ echo *
bla bla.sh evdev newbie newbie.sh rawtest.bin wp yt

$ echo "*"
*

$ foo="hallo    welt"

$ echo $foo
hallo welt

$ echo "$foo"
hallo    welt

$ echo '$foo'
$foo

Bei diesen Beispielen wird noch nicht ganz offensichtlich, wieso dein dirname fehlschlug. Denn tatsächlich werden aus dem $foo bei einem einfachen echo $foo zwei Argumente. Das kannst du dir vielleicht mit touch verdeutlichen:

1
2
3
4
5
6
7
foo="hallo    welt"

# Erzeugt zwei Dateien, "hallo" und "welt"
touch $foo

# Erzeugt eine Datei namens "hallo    welt"
touch "$foo"

dirname meckert bei zwei Argumenten halt, da es nicht weiß, was es mit dem zweiten anfangen soll. ☺

Unix_Samurai

(Themenstarter)

Anmeldungsdatum:
10. Oktober 2008

Beiträge: 661

Vielen Dank. Das Wissen kann ich sehr gut gebrauchen.

Antworten |