2009-07-13 5 views
3

Sur les deux, mon Cygwin et ma boîte Linux (Debian) Je rencontre même question:Scripting Shell. question de substitution commande dans mon script

Je travaille dans un script shell avec une sorte de mise en forme ids, je veux ajouter une barre oblique inverse() avant une occurrence de barre oblique (/).

Mon script sed fonctionne bien à mon terminal:

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

Sortie:

314-12345\/08 

Mais pas aussi bien si je cours command substitution:

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

Ce que je suis manquant ici?

Merci d'avance.

Répondre

13

Il n'y a aucune obligation d'utiliser/comme séparateur pour sed.

s/a/c/ 

mai devenir

s#a#c# 

Donc dans votre cas:

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

ferait le travail.

Je ne peux que deviner que le problème a été causé par un manque de/échapper.

+0

Merci, votre solution fonctionne. Il est plus clair d'utiliser # à la place/dans ce cas. – sourcerebels

8

Voici ce qui se passe. De la bash (1) page de manuel, Souligné par l'auteur:

Lorsque l'ancienne forme backquote de substitution est utilisé, conserve son sens anti-slash littéral , sauf si elle est suivie par $, « ou \. La première backquote non précédée d'une barre oblique inverse termine la substitution de commande. Lorsque vous utilisez le formulaire $ (commande), tous les caractères entre parenthèses constituent la commande; aucun n'est traité spécialement.

Il est donc probable que vous ayez besoin de plus de barres obliques inverses pour la substitution de commandes qu'une commande simple. Vous pouvez déboguer en réglant set -x:

# 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' 

Ainsi, vous pouvez voir que l'apparition de \\ se tourna vers \. Ajouter plus de backslashes fonctionne, mais je préfère le formulaire $(command):

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

Merci pour votre réponse. +1 pour l'autre solution qui a accepté un et 'set -x'. – sourcerebels

Questions connexes