Bash에서 문자열을 이스케이프하는 명령


99

문자열을 이스케이프 처리 된 것으로 변환하는 bash 명령이 필요합니다. 예를 들면 다음과 같습니다.

echo "hello\world" | escape | someprog

탈출 명령은 어디 있습니다 "hello\world""hello\\\world". 그런 다음 someprog는 "hello\\world"예상대로 사용할 수 있습니다 . 물론 이것은 제가 실제로하게 될 일의 단순화 된 예입니다.


5
탈출의 성격은 무엇입니까? 즉, 어떤 문자를 이스케이프해야합니까? C ++ 스타일의 이스케이프를 찾고 계십니까 (탭은 \ t로, 줄 바꿈은 \ n으로, 따옴표는 \ "로 대체)? 문제를 잘 정의하지 않으면 도움이되지 않습니다.
Michael Aaron Safyan


이 질문은 12 가지 다른 것을 의미 할 수 있습니다. 우리가 추측하게하는 대신, 당신이 찾고있는 탈출의 종류를 정확히 말하면 도움이 될 것입니다.
Don Hatch

1
질문은 \에 \\를 사용하는 것과 관련이 있습니다. 수락 된 답변이 있습니다.
User1 2018

답변:


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
기억하세요, %q2012 년까지 10 년 넘게 깨졌습니다 ~.. 휴대용 sed one-liners도 있습니다. stackoverflow.com/a/20053121/1073695
Jo So

1
SED는 참으로 더 나은 너무 달러 기호 벗어날 수 있기 때문이다
untore

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형식으로 (및 현재 로케일에 대해) someprog인용 하므로 OP의 경우 와 똑같은 인용 구문 bash이있을 가능성이 거의없는 경우에만 작동 합니다 .
Stephane Chazelas

9

Pure Bash, 매개 변수 대체 사용 :

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

1
이런 식으로 "hello world"는 "hello \ world"로 이스케이프되지 않습니다. 허용 된 대답의 printf aproach는 그렇게합니다.
vchrizz

1
또한 "% q"는 "03/25/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도 유효한 옵션입니다. 나는 펄에 더 익숙해졌지만 네, 그것도 작동합니다.
Michael Aaron Safyan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.