이것은 잘 작동합니다:
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를 그렇게 자주 사용하지 않지만, 제 기억이 맞다면 괄호(또는 큰따옴표를 사용하는 경우 이중 백슬래시)와 같은 항목도 이스케이프 처리해야 합니다.다음은 이스케이프해야 할 수 있는 문자 목록입니다.