sed 대체 문자열에서 '(작은따옴표)를 이스케이프 처리하세요.

sed 대체 문자열에서 '(작은따옴표)를 이스케이프 처리하세요.

서버 전체에서 일부 iptables 변경을 수행하는 스크립트가 있습니다. 스크립트에는 문자열을 찾아 해당 줄 앞에 iptables 규칙을 삽입하는 sed 명령이 있습니다.

제가 겪고 있는 문제는 제가 편집 중인 파일이 yaml 파일이고 해당 줄에 "and"가 있어야 한다는 것입니다.

삽입된 내용에서 '를 제거하면 작동합니다.

$ sed 's/.*output_snat_lo.conf:.*/- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1\n&/' file.yaml


     - '-t nat -A POSTROUTING -s 192.168.1.25/32 -d 10.0.0.1 -j SNAT --to-source 172.1.1.1'
     - -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
  output_snat_lo.conf:

그러나 슬래시를 사용하여 이스케이프 처리하거나 큰따옴표 안에 넣으면 슬래시가 포함된 큰따옴표는 ' 인쇄할 수 없지만 대신 잘못된 플래그 보내기 옵션이 제공됩니다.

이것이 제가 삽입할 내용입니다.

- '-t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1'\n&/' file.yaml

어떤 제안/팁이 있나요? 전에도 이런 일을 해본 적이 있는 것 같은데 어떻게 했는지 기억이 나지 않습니다.

답변1

정규식에 넣으려는 작은따옴표를 닫고 작은따옴표를 이스케이프 처리한 후 다시 엽니다.

$ echo "a'b" | sed 's/'\''/X/'
aXb

$ echo "aXb" | sed 's/X/'\''/'
a'b

답변2

sed에서는 탈출할 필요가 없습니다. '거기에는 특별한 의미가 없습니다. bash에서 이스케이프 처리해야 합니다.

$ sed -e "s/'/singlequote/g" <<<"'"
singlequote

여기에서 큰따옴표는 bash로부터 작은따옴표를 보호하는 반면 sed는 이를 잘 처리한다는 것을 알 수 있습니다. 작은따옴표를 전환하면 다음과 같은 일이 발생합니다.

$ sed -e 's/'/singlequote/g' <<<"'"
>

bourne (all?) 과 같은 쉘의 이상한 점 '". '큰따옴표로 묶으면 특별한 의미가 없습니다. 관찰하다:

$ echo 'isn'"'"'t this hard?'
isn't this hard?

다른 답변에 표시된 것처럼 백슬래시를 사용하여 이스케이프할 수도 있습니다. 하지만 넌 꼭 해야 해떠나다이전 작은따옴표 블록이 작동합니다. 따라서 이것이 가능해 보이지만 다음과 같습니다.

echo '\''

'첫 번째 장애인 문자 의 의미는 아닙니다 \.

다른 접근 방식을 취하는 것이 좋습니다. sed표현식은 명령줄 인수로 지정할 수 있지만 셸에서 이스케이프해야 하는 비용이 듭니다. 짧은 sed 표현식을 이스케이프 처리하는 것은 나쁘지 않지만 표현식이 상당히 길고 특수 문자가 많이 포함되어 있습니다.

명령줄에서 명령을 지정하는 대신 sed명령을 파일에 넣고 매개변수 호출을 사용하여 sed명령 파일을 지정 하겠습니다 .-fhttp://man7.org/linux/man-pages/man1/sed.1.html아니면 man sed자세히 소개하겠습니다. 이렇게 하면 sed명령은 쉘이 보는 것의 일부가 아니며(파일 이름만 볼 수 있음) 쉘 이스케이프 딜레마가 사라집니다.

$ cat t.sed
s/'*/singlequote(s)/g

$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)

관련 정보