sed 정규식이 작동하지 않습니다

sed 정규식이 작동하지 않습니다

정규식은 끝에 0이 추가된 길이가 46인 숫자나 소문자를 찾습니다.

C:\Users\svuppula>echo "0020000000000000100000000000000000000000000001" | sed -e 's/[0-9a-z]{45}/\10/g'
sed: -e expression #1, char 20: invalid reference \1 on `s' command's RHS

grep이 작동하는 곳

C:\Users\svuppula>echo "0020000000000000100000000000000000000000000001" | grep -E '[0-9a-z]{45}'
"0020000000000000100000000000000000000000000001"

버전:

C:\Users\svuppula>sed --version

sed (GNU sed) 4.2.2

C:\Users\svuppula>grep --version

grep (GNU grep) 2.24

답변1

\1괄호 안의 첫 번째 그룹을 나타내지만 여러분은 그렇지 않습니다. 괄호를 추가하거나 &전체 일치 문자열을 채웁니다.

$ echo "foobar" | sed -e 's/foo/&ABC/'
fooABCbar
$ echo "foobar" | sed -re 's/(foo)/\1ABC/'
fooABCbar

-rGNU sed에서는 괄호를 사용해야 하며 개수 {NN}도 일치해야 합니다. (모든 항목에 보기 흉한 백슬래시 이스케이프를 사용하고 싶지 않다면)

그래서:

echo "0020000000000000100000000000000000000000000001" | sed -re 's/([0-9a-z]{45})/\19/g'
00200000000000001000000000000000000000000000091

숫자 문자열의 길이는 46자이지만 정규식은 45자만 일치하므로 마지막 숫자 앞에 9자가 추가됩니다. 정확히 45자가 포함된 줄만 처리하려면 정규식을 줄의 시작과 끝 부분에 고정하세요.

$ echo "002000000000000010000000000000000000000000001" | sed -re 's/^[0-9a-z]{45}$/&9/g'
0020000000000000100000000000000000000000000019

(입력에 0이 섞이지 않도록 9에 추가한 숫자를 변경했습니다.)

관련 정보