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

관련 정보