형식의 문자열이 [0-9]+\.[0-9]+\.[0-9]
있습니다. 첫 번째, 두 번째 및 세 번째 숫자를 별도로 추출해야합니다. 내가 알기로는, 캡처 그룹이 이것을 할 수 있어야한다. sed "s/\([0-9]*\)/\1/g
첫 번째 숫자 sed "s/\([0-9]*\)/\2/g
를 얻고 두 번째 숫자 sed "s/\([0-9]*\)/\3/g
를 얻고 세 번째 숫자 를 얻는 데 사용할 수 있어야합니다 . 각 경우에, 나는 전체 문자열을 얻고 있습니다. 왜 이런 일이 발생합니까?
답변
우리는 귀하의 의견을 제시하지 않고 완전한 답변을 드릴 수는 없지만 캡처 그룹에 대한 이해가 잘못되었다고 말할 수 있습니다. 순차적으로 사용하지 않고 동일한 대체 연산자의 왼쪽에있는 정규식 만 참조합니다. 캡처 경우, 예를 들어 /(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/'
답변
예:
$ 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
답변
이스케이프 된 모든 괄호를 피하려면 -r, –regexp-extended와 함께 Sed를 사용하십시오.
echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/'
1234, 567, 89 #output