sed -e 's' 명령을 종료하지 않았습니다.

sed -e 's' 명령을 종료하지 않았습니다.

Figlet에서 생성된 일부 텍스트에서 모든 백슬래시를 이스케이프 처리하려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다.

figlet -f $font -t "Foo Bar" | sed -e "s|\\|\\\\|g"

어떤 이유로 이것은 작동하지 않지만 작동합니다.

figlet -f $font -t "Foo Bar" | sed -e "s| |X|g"

sed가 여기서 어떻게 작동하는지 오해하고 있습니까? 이것에 대해서도 비슷한 게시물을 찾을 수 없습니다.

답변1

sed -e "s|\\|\\\\|g"큰따옴표는 구문 분석을 시도하는 셸에서 포함된 백슬래시를 보호하지 않습니다 . 더 간단한 예를 사용하면 이를 더 쉽게 확인할 수 있습니다.

$ echo 'blah\blah'| sed -e "s|\\|blah|g"
sed: -e expression #1, char 10: unterminated `s' command

$ echo 'blah\blah'| sed -e 's|\\|blah|g'
blahblahblah

첫 번째 양식을 사용하려면 sed큰따옴표 대신 작은따옴표로 전환해야 합니다.

$ figlet -t "Foo Bar" | sed -e 's|\\|\\\\|g'
 _____             ____
|  ___|__   ___   | __ )  __ _ _ __
| |_ / _ \\ / _ \\  |  _ \\ / _` | '__|
|  _| (_) | (_) | | |_) | (_| | |
|_|  \\___/ \\___/  |____/ \\__,_|_|

큰따옴표를 사용해야 하는 경우 셸을 이스케이프하려면 더 많은 백슬래시가 필요합니다 sed.

$ figlet -t "Foo Bar" | sed -e "s|\\\|\\\\\\\|g"
 _____             ____
|  ___|__   ___   | __ )  __ _ _ __
| |_ / _ \\ / _ \\  |  _ \\ / _` | '__|
|  _| (_) | (_) | | |_) | (_| | |
|_|  \\___/ \\___/  |____/ \\__,_|_|

관련 정보