MacOS sed: 시작 또는 끝과 일치

MacOS sed: 시작 또는 끝과 일치

이것은 몇 년 동안 나를 괴롭히고 있습니다.

"이것 또는 저것과 일치"가 작동합니다.
"줄 시작 부분 일치"가 작동합니다.
"줄 끝 일치"가 작동합니다.
"줄 시작 또는 줄 끝 일치"는 그다지 많지 않습니다.

모두 MacOS에 있습니다.

echo "hello world" | sed -E 's/(h|d)/X/g'
Xello worlX

echo "hello world" | sed -E 's/(^)/X/g'
Xhello world

echo "hello world" | sed -E 's/($)/X/g'
hello worldX

echo "hello world" | sed -E 's/(^|$)/X/g'
Xhello world

답변1

이는 MacOS sed구현의 버그일 수 있습니다.

귀하의 구문은 FreeBSD 12 및 Ubuntu 18에서 작동합니다.

$ sed -E 's/(^|$)/X/g'
Xhello worldX

버그가 해결될 때까지 이 해결 방법으로 충분할 수 있습니다.

$ echo "hello world" | sed -E -e 's/^/X/' -e 's/$/X/'
Xhello worldX

복잡한 대체 문자열에 대한 귀하의 의견을 고려하면 위의 내용은 조금 더 복잡해지더라도 좀 더 일반화될 수 있습니다.

$ X='replacement text here'
$ printf "echo 'hello world' | sed -E -e 's/^/%s/' -e 's/$/%s/'" "$X" "$X" | sh 
replacement text herehello worldreplacement text here

관련 정보