Экранирование двойных кавычек с помощью псевдонима tcsh

StackOverflow https://stackoverflow.com/questions/382734

  •  23-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь выполнить следующие команды:

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

И было бы неплохо, если бы я мог просто присвоить ему псевдоним чему-нибудь короткому и простому, например "a", "b", "c", "d" и т.д...

Однако некоторые из этих аргументов содержат кавычки, которые портят псевдоним.Кто-нибудь знает, как на самом деле избежать двойных кавычек?Я пробовал такие вещи, как "\"' и \" но, кажется, ничего не работает.

Я использую tcsh в качестве своей оболочки.

Это было полезно?

Решение

Я заставил это работать, сохранив строку с двойными кавычками в переменной, причем строка была заключена в одинарные кавычки.Когда я использую переменную, я заключаю ее в одинарные кавычки.
Пример:

[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% 

Я протестировал это с tcsh на OSX

Другие советы

Все следующие работы в tcsh для достижения различных результатов:

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 ('\'')

Чтобы увидеть, как они интерпретируются командной оболочкой, запустите alias без всяких аргументов:

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

Все, что указано в круглых скобках, выполняется в подоболочке.Это было бы плохо, если вы пытаетесь установить переменные окружения, но в остальном в основном не имеет значения.

Наконец, вот что на самом деле делают эти примеры:

% t; u; v; w; x; y; z
hello world
hello world
hello world
;hello; world
"hello world"
hello world
hello world

tcsh имеет более новую переменную backslash_quote.Не уверен, когда это было добавлено, но это поддерживается в 6.18.01 (версия для OS X El Capitan) и 6.19 (последняя стабильная версия на момент написания).Это делает возможным побег ', ", и ` внутри кавычек.

set backslash_quote

set sentence = 'I\'m a little teapot.'
set sentence2 = "The man said \"hello\""

Если вы не хотите использовать этот параметр, ваш выбор ограничен использованием другого типа кавычек вокруг символа

"The man said "'"'"hello"'"'

или вообще не использовать кавычки и щедро сокращать их в обратном направлении.

The\ man\ said\ \"hello\"

Если вы не можете заставить псевдоним работать, просто напишите короткий сценарий оболочки, chmod + x, и поместите его куда-нибудь в свой $PATH (например, $HOME/bin).:

#!/bin/tcsh
replace -x "must" ...

У меня нет никакого опыта работы с tcsh, но с bash вы делаете это так же, как и любой из этих:

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

Может быть, что-то подобное будет работать в tcsh?

Казалось бы , причина, по которой \" и \' работают не так, как вы ожидаете, не так ли csh традиционно не поддерживал такой синтаксис, поэтому, если tcsh если бы мы безоговорочно поддерживали его, то такие старые скрипты могли бы больше не работать должным образом.

Как упоминалось в другом ответе, сам tcsh имеет set backslash_quote особенность;однако, в отличие от подразумеваемого в упомянутом ответе, это вряд ли новая функция, это просто специфичная для tcsh и фактически была добавлена в tcsh по крайней мере, около 27 лет назад — эта функция была впервые задокументирована на странице руководства по tcsh.man,v 3.8 1991/07/25 04:50:55, что вряд ли квалифицирует его как "новый".

http://mdoc.su/n ,f, d/tcsh.1

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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top