Escapando aspas duplas com apelido tcsh
Pergunta
Eu estou tentando executar os seguintes comandos:
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
E seria bom se eu pudesse somente o alias a curto algo e simples, como "a", "b", "c", "d", etc ...
No entanto, alguns desses argumentos têm uma citação, que é bagunçar o alias. Alguém sabe como realmente escapar as aspas duplas? Eu tentei coisas como '\ "' e \", mas nada parece funcionar.
Eu estou usando tcsh como o meu shell.
Solução
Eu tenho que trabalhar, armazenando a corda com o aspas duplas em uma variável com a string entre aspas simples. Quando eu usar a variável I dentro aspas simples.
Exemplo:
[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%
Eu testei isso com tcsh em OSX
Outras dicas
A seguir todo o trabalho em tcsh
para realizar vários resultados:
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 ('\'')
Para ver como estes são interpretados pelo shell, execute alias
sem argumentos:
% 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'
Qualquer coisa entre parênteses é executado em um subshell. Isso seria ruim se você está tentando variáveis ??de ambiente definidas, mas em grande parte irrelevante contrário.
Finalmente, aqui está o que os exemplos realmente fazer:
% t; u; v; w; x; y; z hello world hello world hello world ;hello; world "hello world" hello world hello world
tcsh
tem uma backslash_quote
variável mais recente. Não tenho certeza quando ele foi adicionado mas é suportado no 6.18.01
(versão no OS X El Capitan) e 6.19
(última versão estável no momento da escrita). Isso torna possível para escapar '
, "
e `
dentro de aspas.
set backslash_quote
set sentence = 'I\'m a little teapot.'
set sentence2 = "The man said \"hello\""
Se você não quiser usar esta opção, suas escolhas são limitadas ao uso de um tipo diferente de citação em torno do símbolo
"The man said "'"'"hello"'"'
ou não o uso de aspas em tudo e liberalmente backslashing coisas.
The\ man\ said\ \"hello\"
Se você não pode obter um alias para o trabalho, basta escrever um script shell curto, chmod + x, e colocá-lo em algum lugar no seu $ PATH (como $ HOME / bin):
#!/bin/tcsh
replace -x "must" ...
Eu não tenho nenhuma experiência com tcsh, mas com o bash você fazê-lo como qualquer um destes:
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
Talvez algo trabalho vontade similar em tcsh?
Parece que a razão que \"
e \'
não funcionam como você espera é que csh
tradicionalmente não apoiar tais sintaxe, por isso, se tcsh
foram para apoiá-lo incondicionalmente, então tais scripts mais antigos podem não funcionar corretamente mais .
Como mencionado em outra resposta, tcsh em si tem o set backslash_quote
recurso; No entanto, ao contrário implícita na resposta mencionado, este não é um novo recurso, é apenas um específico-tcsh, e foi realmente adicionado a tcsh pelo menos cerca de 27 anos atrás - o recurso foi documentada pela primeira vez na página de manual em tcsh.man,v 3.8 1991/07/25 04:50:55
, que dificilmente o qualifica como "novo".
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.