![모든 수치 데이터를 하나씩 인쇄](https://linux55.com/image/14678/%EB%AA%A8%EB%93%A0%20%EC%88%98%EC%B9%98%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%ED%95%98%EB%82%98%EC%94%A9%20%EC%9D%B8%EC%87%84.png)
데이터(영숫자, 임의의 순서 및 레이아웃의 특수 문자)가 포함된 텍스트 파일을 얻습니다. 이제 모든 수치 데이터를 하나씩 인쇄해야 합니다.
예:
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
이렇게 하면 각 입력 행이 공백과 필드 구분 기호로 지정한 문자를 사용하여 필드로 분할됩니다.
그런 다음 각 필드에 대해 스크립트는 필드에 숫자만 포함되어 있는지 확인하고 포함된 경우 인쇄합니다.