작은따옴표를 이스케이프하는 방법은 무엇입니까? [복사]

작은따옴표를 이스케이프하는 방법은 무엇입니까? [복사]

이것은 잘 작동합니다:

sed -i 's#    @driver.find_element(:xpath, "//a\[contains(@href,##' temp_spec.rb

소스를 타겟팅하다

@driver.find_element(:xpath, "//a[contains(@href,'change_district')]").click

나에게 남은 것은 다음과 같습니다.

'change_district')]").click`

하지만 끝에 작은따옴표를 추가하려고 하면 실패합니다.

sed -i 's#    @driver.find_element(:xpath, "//a\[contains(@href,\'##' temp_spec.rb

syntax error near unexpected token `('

나는 \'작은따옴표를 이스케이프하는 데 사용합니다.

텍스트에서 #일반 구분 기호가 아닌 a를 구분 기호로 사용하고 있다는 점에 유의하세요 .//

답변1

작은따옴표 안의 문자열은 셸에서 문자 그대로 사용됩니다(따라서 쌍의 닫는 작은따옴표로 처리되므로 다른 작은따옴표를 포함할 수 없습니다). 즉, 몇 가지 옵션이 있습니다:

  • 작은따옴표로 묶인 문자열을 끝내고 이스케이프된(백슬래시 또는 큰따옴표를 통해) 작은따옴표를 추가한 후 문자열의 다음 부분을 즉시 시작합니다.

    $ echo 'foo'\''bar' 'foo'"'"'bar'
    foo'bar foo'bar
    
  • 문자열에는 큰따옴표를 사용하세요.

    $ echo "foo'bar"
    foo'bar
    

    이는 물론 쉘이 큰따옴표 내에서 확장되는 것에 주의해야 함을 의미합니다.

  • 이해 \xHH하거나 이스케이프 \0nnn하는 유틸리티 (GNU sed가 수행함)를 사용하는 경우 다음 중 하나를 사용할 수 있습니다(ASCII 작은따옴표는 코드 포인트 39(0x27)에 있으므로 예를 들어 \x27).

답변2

구문 오류는 이스케이프되지 않은 정규식을 암시하는 것 같습니다. 저는 개인적으로 sed를 그렇게 자주 사용하지 않지만, 제 기억이 맞다면 괄호(또는 큰따옴표를 사용하는 경우 이중 백슬래시)와 같은 항목도 이스케이프 처리해야 합니다.다음은 이스케이프해야 할 수 있는 문자 목록입니다.

관련 정보