답변:
우리는 귀하의 의견을 제시하지 않고 완전한 답변을 드릴 수는 없지만 캡처 그룹에 대한 이해가 잘못되었다고 말할 수 있습니다. 순차적으로 사용하지 않고 동일한 대체 연산자의 왼쪽에있는 정규식 만 참조합니다. 캡처 경우, 예를 들어 /(foo)(bar)(baz)/
, 다음 foo
것 \1
, bar
될 것입니다 \2
및 baz
있을 것입니다 \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/'
/(foo)/
나오지에 리터럴 일치 (
다음, 문자를 foo
다음 문자 )
. 그룹을 캡처하려면 괄호를 이스케이프하거나 -E
옵션을 사용해야합니다 .
-r
플래그를 사용 하므로 이것이 아직 실행되지 않은 이유라고 생각합니다.
-r
깃발도 그렇게 할 것이지만 이식성이 없습니다. GNU sed는 그것을 지원하지만 다른 많은 사람들은 지원하지 않습니다. 은 -E
더 보편적이다.
예:
$ 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
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
개별 숫자를 캡처하는 것과 같은 것이 필요 합니다.