sed를 사용하여 문자열에서 텍스트를 추출하는 방법은 무엇입니까?


97

내 예제 문자열은 다음과 같습니다.

This is 02G05 a test string 20-Jul-2012

이제 위의 문자열에서 02G05. 이를 위해 sed와 함께 다음 정규식을 시도했습니다.

$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'

그러나 위의 명령은 아무것도 인쇄하지 않으며 내가 믿는 이유는 내가 sed에 제공 한 패턴과 일치 할 수 없기 때문입니다.

그래서, 내 질문은 내가 여기서 뭘 잘못하고 있고 그것을 수정하는 방법입니다.

위의 문자열과 패턴을 파이썬으로 시도하면 결과가 나타납니다.

>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>

6
파이썬은 확실히 아닙니다 sed. 그들의 정규식 풍미는 상당히 다릅니다.
tripleee 2013

답변:


95

이 패턴 \dsed. [0-9]또는 [[:digit:]]대신 시도하십시오 .

전체 일치하는 행이 아닌 실제 일치 만 인쇄하려면 대체를 사용하십시오.

sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'

6
감사합니다. 그러나 내가 .*시도 sed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'하면 전체 라인을 인쇄 하기 때문에 왜 정규식에 필요한지 질문 이 있습니다.
RanRag

7
그게 이유 죠? 경기 전후에 오는 모든 것을 norhing으로 바꾼 다음 전체 라인을 인쇄하십시오.
tripleee

1
@tripleee 이것은 인쇄 2G05하지 않습니다 02G05. 작동하는 표현은's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
Kshitiz Sharma 2013-12-12

1
정확히 두 자리로 하드 코딩됩니다. 같은 sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'것이 더 일반적입니다. (나는 당신의 가정 sed지원을 \?0 또는 1 발생합니다.)
tripleee

참조 stackoverflow.com/a/48898886/874188 펄처럼 탈출 다양한 다른 일반적인 교체하는 방법은 \w, \s, 등
tripleee

101

사용은 grep -E어떻습니까?

echo "This is 02G05 a test string 20-Jul-2012" | grep -Eo '[0-9]+G[0-9]+'

3
+1 이것은 더 간단하며 같은 줄에서 여러 일치하는 경우도 올바르게 처리합니다. 이 경우 복잡한 sed스크립트를 고안 할 수 있지만 왜 귀찮게할까요?
tripleee

egrep용도는 정규 표현식을 연장 sed하고 grep표준 정규 표현식을 사용 egrep하거나 grep -e또는 sed -E확장 된 정규 표현식을 사용하고 문제의 파이썬 코드로 PCRE를 사용할 수 있습니다 (일반적인 정규 표현식 펄), GNU 그렙을 PCRE를 사용 -P옵션을 선택합니다.
Felipe Buccioni

@FelipeBuccioni 실제로는해야 egrep하거나 grep -E또는sed -r
SensorSmith

단일 (첫 번째) 일치의 경우`| head -1` (백틱 없음), 다른 질문에 대한 이 답변 에 따라 .
SensorSmith

1
grep-m 1첫 번째 경기 후 중지 할 수 있습니다.
tripleee

5

sed인식하지 못하는 경우 \d, 사용 [[:digit:]]대신. 또한 이스케이프 +하거나 -r스위치 ( -EOS X의 경우)를 사용해야합니다 .

참고 [0-9]아랍어 힌두교 숫자뿐만 아니라 작동합니다.


나는 시도했다 sed -n '/[0-9]\+G[0-9]\+/p'. 이제 전체 문자열 만 인쇄합니다
RanRag


5

대신 이것을 시도하십시오.

echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'

그러나 한 줄에 두 개의 패턴이 있으면 두 번째 패턴을 인쇄합니다.


또는 더 일반적으로 일치하는 항목이 여러 개인 경우 마지막 항목입니다.
tripleee

0

rextract를 사용해보십시오 . 정규식을 사용하여 텍스트를 추출하고 다시 형식화 할 수 있습니다.

예:

$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'

2G05

이것이 표준 정규식을 사용하는 경우 주위의 대괄호 \d는 완전히 불필요합니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.