2009-09-07 16 views
3

J'ai rencontré un problème plus ennuyeux qui se produit sur la variable PWD quand le chemin actuel inclut un espace. Mon code ressemble un peu à ceci:Citation de Bash du chemin courant (pwd)

mycommand |sed -E ' 
s|mystuff|replacement| ; 
s|'$(pwd)'|replacement| ; 
' 

Cela fonctionne très bien, sauf si le chemin courant contient un caractère espace. Dans le cas contraire, $(pwd) est dilatée à

'mypath/with space'
au lieu de simplement
mypath/with space

Cette cause l'expression sed à foiré (à cause des citations supplémentaires):

sed: 1: "s|mypath/with": unterminated substitute pattern

J'ai remarqué que cela n'aide pas à étendre pwd comme ceci: ${PWD//\'/}.

Des idées sur la façon dont cela peut être résolu?

+0

Est-ce vraiment la commande? Les variables ne sont pas développées à l'intérieur de guillemets simples, donc je ne peux pas voir comment $ (pwd) dans ce qui précède serait expansé du tout. –

+0

Merci d'avoir signalé cela. J'ai ajouté les citations manquantes. –

+0

Avez-vous essayé d'utiliser la variable d'environnement équivalente ($ PWD) au lieu de la substitution de commande pour voir si cela fait une différence? –

Répondre

2

Remplacer les guillemets simples guillemets doubles et remplacer les citations avec backquotes autour PWD:

mycommand | sed -E " 
s|mystuff|replacement| ; 
s|`pwd`|replacement| ; 
" 

Les guillemets doubles permettent une expansion des variables et des commandes backquoted.

+0

Cela va fonctionner. Génial! – vpram86

+1

Vous avez utilisé une variable où l'OP utilisait la substitution de commande, mais cela fonctionne si vous la modifiez pour correspondre (ou si vous l'utilisez tel quel dans la situation appropriée). –

+0

Cela ne fonctionnera pas, car $ (pwd) sera étendu à 'mypath/with space', qui ne correspondra pas dans l'expression sed. Si j'utilisais $ {PWD // \ '/} cela fonctionnerait, cependant. –

1

ce qui se passe si vous remplacez

'$(pwd)' 

avec

'"$(pwd)"' 

ressemblerait à ceci alors:

mycommand | sed -E ' 
s|mystuff|replacement| ; 
s|'"$(pwd)"'|replacement| ; 
' 
+0

Vous avez une double citation à sa place dans la ligne suivante "avec" –

+0

oh bien ... puis-je avoir une ancienne version de sed? Je n'ai même pas l'option -E, seulement -e.J'ai vérifié en utilisant la commande suivante: echo PART1 $ (pwd) PART2 | sed -e's | PART1 | remplacé | ; s | '"$ (pwd)"' | CHEMIN |; ' ; et la sortie est remplacéPATHPART2 – Atmocreations

+0

Non, comparez la ligne que j'ai mentionnée avec l'avant-dernière ligne. C'est juste une faute de frappe. –