변수에 "/"가 포함되어 있을 때 sed를 사용하는 방법은 무엇입니까?

변수에 "/"가 포함되어 있을 때 sed를 사용하는 방법은 무엇입니까?

스크립트에서 실행하고 위의 두 줄을 제거하려면 다음 줄이 있습니다. 하지만 이제 내 $TEST 변수에는 "/DATA/test10"과 같은 값이 포함되고 내 변수 ID에는 "10"이 포함됩니다. sed와 함께 어떻게 사용할 수 있나요?

sed -i ":a;N;s/\n/&/2;Ta;/path = $TEST\/$ID/s/.*//;P;D" /collection.txt

답변1

네가 원한다면문자열을 리터럴로 처리sed이미 답변이 있습니다.

escaped_testx="$(sed -e 's/[\/&]/\\&/g' <<< "$TEST"; echo x)"
escaped_test="${escaped_testx%x}"

추가적으로 x가능합니다후행 줄 바꿈 처리, 그렇지 않으면 명령 대체를 통해 삭제됩니다.

답변2

/를 명령의 구분 문자로 사용하는 것은 sed s필수가 아닙니다. 구분 기호는 s 다음의 첫 번째 문자입니다. 당신은 당신이 좋아하는 (거의) 무엇 |이든 사용할 수 있습니다 #. /문자가 많은 항목(예: 파일 이름 경로)의 경우 쉼표를 사용하는 것을 선호합니다. 왜냐하면 쉼표는 기준선 아래에 있어 보기 쉽기 때문이지만 파일 이름에서는 거의 사용하지 않습니다 .

sed 's,^/home/me/subdir/,^/home/he/otherdir/,'

검색에서 찾지 못한 문자를 선택하고 바꾸세요. 한두 개 있으면 앞에 백슬래시를 추가하세요.

답변3

정규식에서는 앞에 백슬래시를 추가하여 문자를 이스케이프할 수 있습니다.

그래서 /그것은 \/.

이렇게 하면 정규 표현식이 보기 흉해 보이지만( s/\/home\/stuff\/dir1/\/home\/stuff/) 작동합니다!

답변4

변수 값이 실제로 수정되는 것을 방지하려면 다음과 같이 직접 스트리밍할 수 있습니다.

printf "%s\n" "$PATH/$ID"   |
sed   -e's|[]$/.\^[]|\\&|g' \
      -e's|.*|/path = &/g|' |
sed   -e':a;N;s/\n/&/2;Ta' -f- -eP\;D /collection.txt

두 변수 모두 개행 문자를 포함할 수 없다고 가정합니다. 또한 다음과 같은 가정을 합니다.

/path = $TEST\/$ID/s/.*//

...즉, 라인을 지우고 싶을 뿐입니다. get를 사용하여 빈 예약 공간으로 패턴 공간을 덮어쓸 수 있습니다 .(적어도 이 스크립트에서는 예제에서 사용되지 않았으므로 비어 있습니다). 동일한 목적으로 zGNU에서 ap를 사용할 수도 있습니다 .sed

관련 정보