Команда, щоб уникнути рядка в bash


99

Мені потрібна команда bash, яка перетворить рядок на щось, що є екранованим. Ось приклад:

echo "hello\world" | escape | someprog

Де команда втечі робить "hello\world"в "hello\\\world". Потім someprog може використовувати, "hello\\world"як очікує. Звичайно, це спрощений приклад того, що я справді буду робити.


5
Яка природа втечі? Іншими словами, від яких персонажів потрібно уникати? Ви шукаєте втечу у стилі C ++ (де вкладки замінюються на \ t, нові рядки на \ n, лапки на \ "тощо)? Важко допомогти, не визначивши проблему чітко.
Майкл Аарон Сафян


Це питання може означати будь-яке з десятка різних речей. Замість того, щоб змушувати нас здогадуватися, було б корисно, якщо ви точно заявите, який вид втечі ви шукаєте.
Дон Хетч

1
Питання стосувалось використання \\ для \. Є прийнята відповідь.
Користувач1

Відповіді:


155

В Bash:

printf "%q" "hello\world" | someprog

наприклад:

printf "%q" "hello\world"
hello\\world

Це також можна використовувати через змінні:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
Зверніть увагу, він %qбув розбитий більше десяти років приблизно до 2012 року. З ним були проблеми ~. Є також портативні sed однокласні вкладиші stackoverflow.com/a/20053121/1073695
Jo So

1
sed справді краще, тому що може втекти і від доларових знаків
unore

2
@untore: a='abc$def":'; printf '%q\n' "$a"результати в abc\$def\":(знак долара не відображається). Це Bash 4.3 (такий же результат я отримав у Bash 3.2). Яку версію ви використовуєте?
Призупинено до подальшого повідомлення.

3
щоб уникнути знака долара, просто використовуйте замість цього одинарні лапки, наприклад:printf "%q" 'he$l&lo\world'
LeandroCR

bash printf '%q\n' textцитує текст у bashформаті (і для поточного мовного стандарту), так що це спрацювало б лише у випадку OP, якщо у них someprogбув точно такий же синтаксис цитування, як bashце дуже малоймовірно.
Стефан Чазелас,

9

Pure Bash, використовуйте заміну параметрів:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
таким чином "привіт світ" не вдається перейти до "привіт \ світ" - printf підхід у прийнятій відповіді робить це.
vchrizz

1
Крім того, "% q" не виходить з '/', як у "25.03.2017", який мені потрібно було перевести в "03 \ / 25 \ / 2017" (щоб він міг знаходитись у розділі з роздільником '/' вираз).
wrlee

0

Ви можете використовувати perl для заміни різних символів, наприклад:

$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world

Залежно від характеру вашого втечі, ви можете створити кілька ланцюжків дзвінків, щоб уникнути відповідних символів.


1
Чому не sed? $ echo "hello \ world" | sed 's / \\ / \\\\ /'
Space

1
@Octopus, це теж допустимий варіант. Мені буває зручніше з perl, але так, це теж працює.
Майкл Аарон Сафян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.