cut을 사용하지 않고 라인의 첫 번째 패턴 일치 가져오기

cut을 사용하지 않고 라인의 첫 번째 패턴 일치 가져오기

다음과 유사한 텍스트가 많이 있습니다(테스트 및 데이터를 최대한 단순하게 유지하기 위해).

first 1 is the real 2 time the word matched 3 
appeared on the previous line but is 4 the fourth.
Every line can have more numbers 5 because numbers 6 are everywhere
I need to extract the number just after the word 7 that precedes 8

grep단어 다음에 나오는 첫 번째 숫자를 추출하기 위해 테스트 중인 명령은 다음과 같습니다.

grep -Eoi ' [0-9]{1}'

출력은 다음과 같습니다

 1
 2
 3
 4
 5
 6
 7
 8

원하는 출력은 다음과 같습니다.

 1
 4
 5
 7

cut또는 사용이 허용되지 않습니다 awk.

답변1

나는 이것이 grep을 마스터하는 연습이라고 생각합니다. 순수한 grep 솔루션은 다음과 같습니다.

한 줄에:

echo "first 1 is the real 2 time the word matched 3 " |grep -Eo '[0-9]' |grep -m1 -E '[0-9]'

불행하게도 처음에는 grep을 사용해도 grep -m1원하는 결과를 얻지 못했습니다.

여러 줄이 포함된 파일에서는 루프를 사용해야 합니다.

while read -r line; do
grep -Eo '[0-9]' <<<"$line" |grep -m1 -E '[0-9]'
done < file.txt

또는 명령줄에서:

while read -r line; do grep -Eo '[0-9]' <<<"$line" |grep -m1 -E '[0-9]';done < a.txt

출력은 예상대로입니다.

답변2

그것을 사용하는 것이 허용됩니까 sed?

$ sed 's/[^[[:digit:]]*\([[:digit:]]\).*/\1/' << EOF
> first 1 is the real 2 time the word matched 3 
> appeared on the previous line but is 4 the fourth.
> Every line can have more numbers 5 because numbers 6 are everywhere
> I need to extract the number just after the word 7 that precedes 8
> EOF
1
4
5
7

답변3

당신이 사용할 수있는 grep명령을 사용하면 먼저 첫 번째 십진수 시퀀스 이전의 모든 항목을 일치시켜 반환한 다음 숫자만 일치하여 반환합니다.

grep -Eo '^[^0-9]*[0-9]{1,}' file | grep -Eo '[0-9]{1,}'

{1,}[참고: AFAIK {1}는 중복되고 십진수 시퀀스를 일치시키려고 한다고 가정하기 때문에 이것을 사용하고 있습니다 . ]

PCRE 모드 사용이 허용되고 이를 지원하는 경우 가변 너비 Lookbehind 어설션을 사용하여 grep단일에서 동일한 작업을 효과적으로 수행 할 수 있습니다.grep\K

grep -Po '^[^0-9]*\K[0-9]+' file

\d또는 ( 십진수의 Perl 스타일 표현을 사용하여 약간 더 간결하게 ):

grep -Po '^[^\d]*\K\d+' file

즉, 당신 이후로아니요당신 말이에요아니요자체적으로 허용하면 perl공백으로 구분된 필드로 분할한 다음 모든 숫자로 구성된 첫 번째 필드를 찾을 수 있습니다.

perl -MList::Util=first -alne 'print first { /^\d+$/ } @F'

답변4

다음을 시도해 볼 수 있습니다.

grep -Eon ' [0-9]{1}' | sort -k1,1 -u

출력은 다음과 같습니다(줄 번호가 거래 차단기인지 확실하지 않음).

1: 1
2: 4
3: 5
4: 7

또는 이 표현식은 원하는 출력을 제공합니다.

grep -Eon ' [0-9]{1}' | sort -k1,1 -u | grep -o ' .*'

출력(예제 출력에는 선행 공백이 포함됨):

 1
 4
 5
 7

관련 정보