모든 수치 데이터를 하나씩 인쇄

모든 수치 데이터를 하나씩 인쇄

데이터(영숫자, 임의의 순서 및 레이아웃의 특수 문자)가 포함된 텍스트 파일을 얻습니다. 이제 모든 수치 데이터를 하나씩 인쇄해야 합니다.

예:

this is txt *24354 filer3243gdt             4332 123
sfdg gtdf, gtdf;tr 3435; gfdsf .43er,       ;43 3543; 
4354w t535 tfgq 3542 fgdg, 243; wre; 24342 ; 24354 ;;;; 13 

tgd dsgf ,[email protected]

산출

4332
123
3435
43
3543
3542
243
24342
24354
13

추신: 문제는 이 숫자에 특정 시작이나 끝이 없기 때문에 이를 수행할 정규식을 생각할 수 없다는 것입니다.

그 역할공간,반점,세미콜론,가리키다, 그리고새로운 팀숫자를 구분하는 데 사용할 수 있습니다.

답변1

tr표준 합계 사용 grep:

tr -s ',;. ' '[\n*]' <file | grep -x '[[:digit:]]*'

이것은 먼저 가능한 모든 구분 문자를 개행 문자로 변경합니다(그리고 여러 연속 개행 문자를 하나로 "압착"합니다). 첫 번째 단계에서는 출력이 생성됩니다.

this
is
txt
*24354
filer3243gdt
4332
123
sfdg
gtdf
gtdf
tr
3435
gfdsf
43er
43
3543
4354w
t535
tfgq
3542
fgdg
243
wre
24342
24354
13
tgd
dsgf
3256653756456744rfdgf@gmail
com

이로부터 grep숫자만 ​​포함된 행을 추출하는 데 사용됩니다. 전체 줄 일치를 강제하는 옵션 -x이며 사용되는 패턴은 모든 자릿수와 일치합니다.grep

grep단계의 결과는

4332
123
3435
43
3543
3542
243
24342
24354
13

이는 예상 출력과 동일합니다.

내 첫 번째 시도는 다음과 같았습니다

tr -s '[:punct:][:blank:]' '[\n*]' | grep -x '[[:digit:]]*'

그것은 사용한다어느구두점이나 공백 문자는 구분 기호 역할을 합니다. 결과는 첫 번째 결과이기도 합니다 24354(입력에서 그 앞에 결과가 있습니다 *). 이것은 틀릴 수도 있지만 코드는더 좋아 보여:-)

문자 [:punct:]클래스에는 컬렉션이 포함되어 있습니다.

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

[:blank:]공백과 탭 입니다 .

답변2

여기에서는 PCRE 둘러보기가 필요합니다.

grep -oP '(?<=^|\s|;)\d+(?=$|\s|;)' file

누락된 유효한 구분 기호를 정규식의 확실한 위치에 추가할 수 있다고 생각합니다.

답변3

$ perl -F'[\s,;.]' -lane 'foreach (@F) {print $_ if m/^\d+$/}' inputfile
4332
123
3435
43
3543
3542
243
24342
24354
13

이렇게 하면 각 입력 행이 공백과 필드 구분 기호로 지정한 문자를 사용하여 필드로 분할됩니다.

그런 다음 각 필드에 대해 스크립트는 필드에 숫자만 포함되어 있는지 확인하고 포함된 경우 인쇄합니다.

관련 정보