모든 공백 앞에 백 슬래시를 추가하려면 어떻게해야합니까?


8

가급적 tr또는 sed명령 을 사용하여 모든 공간 앞에 백 슬래시를 넣을 수 있습니까?

내 스크립트는 다음과 같습니다.

#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "

공백을 백 슬래시로 대체하고 공백을 백 슬래시로 바꾸고 백 슬래시 + 공백이 아닌 공백으로 바꿉니다.

이것이 내가 얻는 출력입니다.

hello\bye

예상 출력 :

hello\ bye

좀 더 자세히 설명해 주시겠습니까? 텍스트 파일을 변경하는 스크립트를 찾고 있습니까? 정확히 무엇을 찾고 있습니까?
Fabby

tr x ' ', x교체하려는 캐릭터는 어디에 있습니까?
Doorknob

업데이트-추가 된 예.
daka

답변:


17

tr여러 문자를 수행 할 수 없습니다. 대신 다음 중 하나를 사용하십시오.

  1. sed

    echo "$line" | sed 's/ /\\ /g' 
    

    또는

    sed 's/ /\\ /g' <<< "$line"
    
  2. echo "$line" | perl -pe 's/ /\\ /g'  
    

    또는

    perl -pe 's/ /\\ /g'<<< "$line"
    

    quotemeta에는 문자열의 모든 이상한 것들을 피할 수 있는 멋진 함수 가 있습니다.

    line='@!#$%^&*() _+"'
    perl -ne 'print quotemeta($_)' <<< $line
    

    위의 내용은 인쇄됩니다

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. 당신은 또한 사용할 수 있습니다 printf%q:

    %q  quote the argument in a way that can be reused as shell input
    

    그래서 당신은 할 수 있습니다

    echo "$line" | printf "%q\n" 
    

    이것은 Perl과 마찬가지로 공백뿐만 아니라 모든 특수 문자를 quotemeta이스케이프 합니다.

    printf "%q\n" <<<$line
    
  4. 변수에 줄이 있으면 bash에서 직접 할 수 있습니다.

    echo ${line// /\\ }
    

예, 이것은 작동하지만 "a"의 모든 발생을 백래시 + 공백으로 바꾸려고 할 때 작동하지 않습니다.
daka

@sudoman 변수에 선이 있으므로 옵션을 더 추가했습니다.
terdon

강타의 printf내장은 비슷한 기능이있다 quotemeta- printf '%q\n' "$line"IIRC을해야합니다.
evilsoup

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.