Échapper guillemets doubles avec alias tcsh
Question
Je suis en train d'exécuter les commandes suivantes:
replace -x "must " A2input.txt
replace -x " a" -f -s ## A2input.txt
replace -x to -s ## -a A2input.txt
replace -x faith -f "unequivocal" A2input.txt
Et ce serait bien si je pouvais alias à quelque chose de court et simple comme "a", "b", "c", "d", etc ...
Cependant, certains de ces arguments ont une citation, qui salit l'alias. Est-ce que quelqu'un sait comment échapper en fait les guillemets doubles? J'ai essayé des choses comme « \" » et \", mais rien ne semble fonctionner.
J'utilise tcsh comme ma coquille.
La solution
Je l'ai à travailler en stockant la chaîne avec la double citation dans une variable avec la chaîne entourée de guillemets simples. Lorsque j'utilise la variable I à l'intérieur des guillemets simples.
Exemple:
[11:~] phi% [11:~] phi% set text = 'a quote "' [11:~] phi% alias ec echo '$text' [11:~] phi% ec a quote " [11:~] phi% [11:~] phi% alias ec echo this has '$text' [11:~] phi% ec this has a quote " [11:~] phi%
Je l'ai testé cela avec tcsh sur OSX
Autres conseils
Ce qui suit tous les travaux en tcsh
pour accomplir divers résultats:
alias t echo hello world # you may not actually need any quotes alias u 'echo "hello world"' # nested quotes of different types alias v echo\ \"hello\ world\" # escape everything alias w echo '\;'hello'";"' world # quote/escape problem areas only alias x 'echo \"hello world\"' # single quote and escape for literal " alias y "echo "\""hello world"\" # unquote, escaped quote, quote ("\"") alias z 'echo '\''hello world'\' # same goes for single quotes ('\'')
Pour voir comment ceux-ci sont interprétés par le shell, exécutez alias
sans argument:
% alias t (echo hello world) u echo "hello world" v echo "hello world" w (echo \;hello";" world) x echo \"hello world\" y echo "hello world" z echo 'hello world'
Tout entre parenthèses est exécuté dans un sous-shell. Ce serait mauvais si vous essayez de définir des variables d'environnement, mais la plupart du temps hors de propos autrement.
Enfin, voici ce que les exemples font réellement:
% t; u; v; w; x; y; z hello world hello world hello world ;hello; world "hello world" hello world hello world
tcsh
a une backslash_quote
nouvelle variable. Je ne sais pas quand il a été ajouté, mais il est pris en charge dans 6.18.01
(version OS X sur El Capitan) et 6.19
(dernière version stable au moment de la rédaction). Cela permet d'échapper '
, "
et `
à l'intérieur des guillemets.
set backslash_quote
set sentence = 'I\'m a little teapot.'
set sentence2 = "The man said \"hello\""
Si vous ne souhaitez pas utiliser cette option, vos choix sont limités à l'utilisation d'un type de citation différente autour du symbole
"The man said "'"'"hello"'"'
ou de ne pas utiliser des citations du tout et des choses backslashing généreusement.
The\ man\ said\ \"hello\"
Si vous ne pouvez pas obtenir un alias de travail, il suffit d'écrire un script shell, chmod + x, et le mettre quelque part dans votre $ PATH (comme $ HOME / bin):
#!/bin/tcsh
replace -x "must" ...
Je n'ai aucune expérience avec tcsh, mais avec bash vous le faites comme l'un de ces:
alias t='echo "hello world"' # using single quotes to enclose entire string
alias t=echo\ \"hello\ \ world\" # escape " and <space>
alias t="echo \"hello world\"" # double-quote + escape inner double quotes
Peut-être quelque chose de similaire fonctionnera dans tcsh?
Il semblerait que la raison pour laquelle \"
et \'
ne fonctionnent pas comme prévu est que csh
traditionnellement ne prennent pas en charge cette syntaxe, donc, si tcsh
devaient soutenir sans condition, alors ces anciens scripts ne fonctionnent pas correctement plus .
Comme mentionné dans une autre réponse, Tcsh lui-même a la set backslash_quote
fonction; Cependant, à la différence impliquée dans la réponse mentionnée, c'est à peine une nouvelle fonctionnalité, il est juste un spécifique à tcsh, et a été effectivement ajouté à tcsh.man,v 3.8 1991/07/25 04:50:55
, qui peut difficilement être qualifié comme "nouveau".
backslash_quote (+) If set, backslashes (`\') always quote `\', `'', and `"'. This may make complex quoting tasks easier, but it can cause syntax errors in csh(1) scripts.