[regex] sed : 일치하는 그룹 만 인쇄
마지막 두 숫자 (1 개의 정수, 1 개의 부동 소수점, 선택적 공백)를 잡고 인쇄 만하고 싶습니다.
예:
foo bar <foo> bla 1 2 3.4
인쇄해야합니다 :
2 3.4
지금까지 다음과 같은 내용이 있습니다.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
나에게 줄거야
foo bar <foo> bla 1 replacement
그러나 그룹 1로 바꾸려고하면 전체 줄이 인쇄됩니다.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
그룹의 정규 표현식과 일치하는 줄 섹션 만 인쇄하려면 어떻게해야합니까?
답변
전체 줄과 일치하므로 .*
정규 표현식의 시작 부분에 a 를 추가 하십시오. 이로 인해 전체 줄이 그룹의 내용으로 바뀝니다.
echo "foo bar <foo> bla 1 2 3.4" |
sed -n 's/.*\([0-9][0-9]*[\ \t][0-9.]*[ \t]*$\)/\1/p'
2 3.4
답변
grep 은 추출에 적합한 도구입니다.
귀하의 예와 정규식을 사용하여 :
kent$ echo 'foo bar <foo> bla 1 2 3.4'|grep -o '[0-9][0-9]*[\ \t][0-9.]*[\ \t]*$'
2 3.4
답변
그리고 또 다른 옵션으로, 나는 awk와 함께 갈 것입니다!
echo "foo bar <foo> bla 1 2 3.4" | awk '{ print $(NF-1), $NF; }'
이것은 공백으로 입력을 나누고 (여기서는 STDIN을 사용하고 있지만 입력은 쉽게 파일 일 수 있음) 마지막-한 필드와 마지막 필드를 인쇄합니다. $NF
변수 필드의 수는 공간의 폭발 후 발견 잡아.
이것의 장점은 마지막 두 필드 만 계속 바뀌면 마지막 두 필드가 바뀌는 것이 중요하지 않다는 것입니다.
답변
절단 명령은이 정확한 상황을 위해 설계되었습니다. 구분 기호를 “잘라 내고”출력 할 청크를 지정할 수 있습니다.
예를 들어 :
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
결과는 다음과 같습니다.
2 3.4
-d는 구분자를 설정합니다
-f는 출력 할 ‘필드’범위를 선택합니다.이 경우 원래 문자열의 6 ~ 7 번째 청크입니다. 범위를 목록으로 지정할 수도 있습니다 (예 🙂 6,7
.
답변
나는 동의 @kent 이 잘 적합된다 grep -o
. 패턴 내에서 그룹을 추출해야하는 경우 두 번째 grep으로 그룹을 수행 할 수 있습니다.
# To extract \1 from /xx([0-9]+)yy/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'xx[0-9]+yy' | grep -Eo '[0-9]+'
123
4
# To extract \1 from /a([0-9]+)b/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'a[0-9]+b' | grep -Eo '[0-9]+'
678
9