2009-07-13 3 views
3

Auf beide, meine Cygwin und meine Linux-Box (Debian) Ich erlebe gleiches Problem:Shell-Skripting. Substitution Befehl Problem in meinem Skript

Ich arbeite in einem Shell-Skript mit irgendeiner Art ids formatiert werden kann, mag ich hinzufügen ein umgekehrter Schrägstrich() vor einem Schrägstrich (/).

Mein sed-Skript gut funktioniert an meinem Terminal:

# export someid="314-12345/08" 
# echo "${someid}" | sed 's/\//\\\//' 

Ausgang:

314-12345\/08 

aber nicht so gut, wenn ich command substitution laufen:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'` 
sed: -e expression #1, char 9: unknown option to `s' 

Was ich bin hier fehlt?

Vielen Dank im Voraus.

Antwort

13

Es besteht keine Verpflichtung zur Verwendung/als Trennzeichen für sed.

someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'` 

würde die Arbeit machen:

s/a/c/ 

s#a#c# 

So in Ihrem Fall werden könnten.

Ich kann nur vermuten, dass das Problem durch einen Mangel an/Flucht verursacht wurde.

+0

Dank, Ihre Lösung funktioniert. Es ist sehr klar, # stattdessen zu verwenden/in diesem Fall. – sourcerebels

8

Hier ist was los ist. Von der bash (1) man-Seite, Hervorhebung von mir:

Wenn die alten Stil Backquote Form der Substitution verwendet wird, Backslash behält seine wörtliche Bedeutung außer wenn sie von $ gefolgt, ‚oder \. Das erste Backquote, dem kein Backslash vorangestellt ist, beendet die Befehlsersetzung. Bei Verwendung der $ (Befehl) -Form bilden alle Zeichen zwischen den Klammern den Befehl; keine werden speziell behandelt.

Also wahrscheinlich brauchen Sie mehr Backslashes für die Befehlsersetzung als ein einfacher Befehl. Sie können dies durch set -x Einstellung debuggen:

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'` 
++ echo 314-12345/08 
++ sed 's/\//\\//' 
sed: 1: "s/\//\\//": bad flag in substitute command: '/' 
+ someidformatted= 
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//') 
++ echo 314-12345/08 
++ sed 's/\//\\\//' 
+ someidformatted='314-12345\/08' 

So können Sie sehen, dass wird zu \ ein Auftreten von \\ gedreht. Das Hinzufügen von mehr Schrägstriche funktioniert, aber ich ziehe die $(command) Form:

# someidformatted=$(echo "${someid}" | sed 's/\//\\\//') 
+0

Danke für Ihre Antwort. +1 für eine andere Lösung, die eine akzeptiert und '-x' gesetzt hat. – sourcerebels