sed 캡처 그룹이 작동하지 않습니다

sed 캡처 그룹이 작동하지 않습니다

형식화된 문자열이 있습니다 [0-9]+\.[0-9]+\.[0-9]. 첫 번째, 두 번째, 세 번째 숫자를 별도로 추출해야 합니다. 내가 이해한 바로는 캡처 그룹이 이 작업을 수행할 수 있어야 합니다. 이것을 사용하여 sed "s/\([0-9]*\)/\1/g첫 번째 숫자, sed "s/\([0-9]*\)/\2/g두 번째 숫자, sed "s/\([0-9]*\)/\3/g세 번째 숫자를 얻을 수 있어야 합니다 . 그러나 모든 경우에 나는 전체 문자열을 얻습니다. 왜 이런 일이 발생합니까?

답변1

입력하신 예시가 없으면 완전한 답변을 드릴 수 없으나 그룹 캡처에 대한 이해가 잘못되었음을 말씀드릴 수 있습니다. 순서대로 사용하지 않고 동일한 대체 연산자의 왼쪽에 있는 정규식을 참조할 뿐입니다. 예를 들어, 캡처하면 /(foo)(bar)(baz)/will foobe \1, barwill be \2bazwill be 입니다 \3. s/(foo)/\1/; s/(bar)/\2/두 번째 s///호출에는 캡처링 그룹이 하나만 있으므로 \2정의되지 않으므로 이 작업을 수행할 수 없습니다 .

따라서 세 가지 숫자 세트를 캡처하려면 다음을 수행해야 합니다.

sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'

또는 더 읽기 쉽게 하려면 다음을 수행하세요.

sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'

답변2

예:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78

또는 함께:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78

답변3

모든 이스케이프된 괄호를 피하려면 -r, --regexp-extended와 함께 Sed를 사용하세요.

echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/' 
1234, 567, 89    #output

관련 정보