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