문자를 삽입할 가능성이 없고 정규식 사용을 포기하지 않고 안전한 방법으로 정규식을 사용하여 문자열을 바꾸는 함수를 만들고 있습니다.
#! /bin/sh
stringer()
{
pattern="${1}"
replace="${2}"
printf '%s\n' "examp/e w\\th sed: " | sed "s/${pattern}/${replace}/g"
}
stringer "\\/" "l"
지금까지는 괜찮았지만 다음을 사용한다면:
stringer "/" "l"
sed 오류가 발생합니다. 이와 관련하여 입력 매개 변수를 이스케이프할 수 있다는 것을 알고 있지만 정규식에서는 작동하지 않습니다. 정규식과 함께 사용할 수 있기를 원합니다. sed가 있거나 없는 제안은 있지만 Posix는 없습니다. 호환 확장?
답변1
sed
예를 들어 다음에서 탈출해야 하기 때문에 /를 탈출하는 것은 매우 어렵습니다 .
Foo/bar
Foo[XY]/
Foo\[/x\]
Foo\\/bar
하지만 안에는 없어
Foo [/x]bar
Foo [^]/x]bar
Foo [x[:blank:]/y]
Foo\/bar
awk
사용하기 더 쉬울 수도 있어요
repl() {
PATTERN=$1 REPL=$2 awk '
{gsub(ENVIRON["PATTERN"], ENVIRON["REPL"]); print}'
}
그러나 awk의 정규 표현식은 확장된 정규 표현식입니다(sed의 기본 정규 표현식과 반대). 일치하는 부분을 나타내기 위해 교체 부분의 &를 이해하지만 \1
busybox awk를 제외하면 , 또한 스키마의 역참조도 지원하지 않습니다.
여기서는 접근 방식을 고수하면서 /를 이스케이프해야 한다는 사실을 기록할 수 있습니다. 그럼에도 불구하고 정규식 연산자가 무엇인지 문서화해야 하며(사용자가 이를 이스케이프해야 할 수 있으므로) 개행 문자는 일치할 수 없으며 대체 항목과 & 및 백슬래시의 특수 동작에서 개행 문자를 이스케이프해야 합니다.