Ruby: Как вставить три обратных слеша в строку? - PullRequest
1 голос
/ 13 марта 2020

Я хочу использовать обратные пометки в ruby для вызова программы. Параметр является строковой переменной, содержащей один или несколько обратных символов, т. Е. «& E? @@ A`?». Следующая команда возвращает новую метку в качестве возвращаемого значения:

echo "&E?@@A\`?" | nauty-labelg 2>/dev/null

Из программы ruby я могу вызвать ее следующим образом и получить правильный результат:

new_label = `echo "&E?@@A\\\`?" | nauty-labelg 2>/dev/null`

Я хочу добиться того же, используя переменную для метки. Поэтому мне нужно вставить три слеша в мою переменную label = "& E? @@ A`?" чтобы избежать спины. Кажется, работает следующее, хотя и не очень элегантно:

escaped_label = label.gsub(/`/, '\\\`').gsub(/`/, '\\\`').gsub(/`/, '\\\`')

Но новую переменную нельзя использовать при вызове программы:

new_label = `echo "#{escaped_label}" | nauty-labelg 2>/dev/null`

В этом случае я не получаю ответ от nauty-labelg.

1 Ответ

0 голосов
/ 13 марта 2020

Итак, мне нужно вставить три слеша в мою переменную метку = "& E? @@ A`?" чтобы избежать обратного удара.

Нет, вам нужно только добавить одну обратную косую черту sh для вывода. Для экранирования ` специальный bash символ. Остальные два предназначены только для представления предложений, в противном случае это недопустимый код Ruby.

new_label = `echo "&E?@@A\\\`?" | nauty-labelg 2>/dev/null`

Первый backsla sh выйдет из второго (выводит один единственный backsla sh) , Третья обратная косая черта sh экранирует символ ` (выводя один единственный `).

Вы должны добавлять обратную косую черту только перед символами, которые имеют особое значение в контексте двойных кавычек bash. Это специальные символы : $, `, \ и \n. Они могут быть экранированы с помощью следующего кода:

def escape_bash_string(string)
  string.gsub(/([$`"\\\n])/, '\\\\\1')
end

Для label = "&E?@@A`?" следует экранировать только `.

escaped_string = escape_bash_string("&E?@@A\`?")
puts escaped_string
# &E?@@A\`?
...