스크립트에서 실행하고 위의 두 줄을 제거하려면 다음 줄이 있습니다. 하지만 이제 내 $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/.*//
...즉, 라인을 지우고 싶을 뿐입니다. g
et를 사용하여 빈 예약 공간으로 패턴 공간을 덮어쓸 수 있습니다 .(적어도 이 스크립트에서는 예제에서 사용되지 않았으므로 비어 있습니다). 동일한 목적으로 z
GNU에서 ap를 사용할 수도 있습니다 .sed