4자가 아닌 숫자를 모두 제거하세요.

4자가 아닌 숫자를 모두 제거하세요.

9838, 와 같이 4자가 아닌 숫자를 모두 제거해야 합니다 6738.13371889

나는 이 명령이 작동할 것이라고 생각합니다:

sed 's/....[^0-9]//g'

.정규식의 모든 문자를 나타내며 [^0-9]숫자를 제거하지 않습니다.

입력 예는 다음과 같습니다.

9228 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945

할 것이다:

9228 8473 1914 1918 8391 1939 1945

답변1

다음 명령으로 대답 할 수 있습니다 grep.

입력 파일:

9228 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945

주문하다:

grep -Eo '\<[0-9]{4}\>' file |tr '\n' ' '

길이가 4인 임의의 숫자를 반환합니다.

-E-o일치하는 부분만 인쇄하려면 확장 정규식으로 전환하세요.

산출:

9228 8473 1914 1918 8391 1939 1945

업데이트된 답변:

입력 파일:

9228 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945

foo1234bar
a1111
12345
0x2222ff
1.3333
2.54321

주문하다

grep -oP '(?<![0-9])[0-9]{4}(?![0-9])' file | tr '\n' ' '

부정적인 Lookbehind/lookforward를 사용한 grep:

(?<![0-9])[0-9]{4}(역방향 부정 검색): 숫자를 길이=4와 일치시키고 선행 숫자가 없습니다 [0-9].
[0-9]{4}(?![0-9])(부정 예측): 숫자를 길이 = 4로 일치시키고 뒤에 숫자가 없습니다.

산출:

9228 8473 1914 1918 8391 1939 1945 1234 1111 2222 3333

답변2

당신은 그것을 사용할 수 있습니다 perl.

perl -nle'print join " ", /(?<![0-9])[0-9]{4}(?![0-9])/g'

이는 여러 줄 입력에서도 작동하므로 다음과 같은 경우가 있습니다.

9228 Hello 8473 World War 1 1914-1918
Hello 8391 World War 2 1939-1945

다음과 같은 반품 정보를 받게 됩니다.

9228 8473 1914 1918
8391 1939 1945

( -0777숫자를 같은 줄에 표시하려면 추가하세요.)

답변3

POSIX적으로:

< file tr -cs 0-9 '[\n*]' | grep -xE '.{4}' | paste  -sd ' ' -

답변4

단일 백슬래시를 사용하여 s///POSIX에서 이 작업을 수행할 수 있지만 sed백슬래시가 많이 있습니다.

sed 's/[^0-9]*\([0-9]\{5,\}\)*[^0-9]*\([0-9]\{4\}\)*.\{0,1\}/ \2/g
' <<\IN
92828 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945
IN

산출

8473  1914 1918 8391  1939 1945

g5개 이상의 숫자가 포함된 모든 시퀀스를 먼저 집어삼킨 다음 ^숫자가 아닌 시퀀스 를 모두 먹어치 웁니다 .그 다음에귀하의 일치 ​​항목뿐만 아니라 다른 문자의 마지막 0 또는 1도 포함됩니다. 전체 명령문에서 일치하는 표현식 1개만 저장되므로 중간 공백을 제외하고 이것이 남습니다.

하지만 약간의 번역을 하면 상황이 더 쉬워집니다.

sed 'y/ /./;s/[0-9]\{4,\}/ & /g;s/\( [^ ]\{4\} \)*[^ ]*/\1/g
' <<\IN
92828 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945
IN

산출

  8473  1914  1918  8391  1939  1945 

sed먼저 모든 공백을 점으로 음역하세요. 다음으로 4개 이상의 숫자 시퀀스를 공백으로 묶습니다. 마지막으로, 공백이 아닌 모든 문자를 제거하고 공백으로 둘러싸인 4개의 문자 시퀀스를 저장합니다.

관련 정보