다음과 같은 파일이 있습니다.
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
fd_tr_mn_0716
fd_tr_mn_09013
fd_tr_mn_092433
fd_tr_mn_1020333
fd_tr_mn_12013332
dsdas_1
dsdas_12
dsdas_212
sdasd_4567
weqwe_32323
dasds_232322
2321321_rewrwe_3233
32_Ff
asdasd_1_fff
길이가 4-8인 줄로 끝나는 줄을 삭제해야 합니다. 숫자로 시작하는 줄도 삭제할 수 있습니다.
아래 코드는 제거하려는 행과 일치하지만 해당 일치 항목에 대해 역방향 일치를 수행하고 추가하면 -iv
작동하지 않습니다.
cat test.txt | grep -oP '(?<![0-9])[0-9]{4,8}(?![0-9])'
답변1
다음 줄을 삭제하려면:
숫자로 시작:
^[0-9]
또는^\d
또는 4~8자의 숫자로 끝납니다:
[0-9]{4,8}$
또는\d{4,8}$
.grep -vE '^[0-9]|[0-9]{4,8}$' infile >output sed -E '/^[0-9]|[0-9]{4,8}$/d' infile >output grep -vP '^\d|\d{4,8}$' infile >output
다음 줄을 삭제하려면:
숫자로 시작:
^[0-9]
아니면정확히4~8자 길이:
[^0-9][0-9]{4,8}$
또는\D\d{4,8}$
.grep -vE '^[0-9]|[^0-9][0-9]{4,8}$' infile >output sed -E '/^[0-9]|[^0-9][0-9]{4,8}$/d' infile >output grep -vP '^\d|\D\d{4,8}$' infile >output
답변2
POSIX awk를 사용하십시오.
$ awk '!( /^[0-9]/ || /(^|[^0-9])[0-9]{4,8}$/ )' file
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
dsdas_1
dsdas_12
dsdas_212
asdasd_1_fff
답변3
사용행복하다(이전 Perl_6)
다음은 숫자로 시작하거나 줄 끝에 인접한 4~8자리 숫자를 포함하는 줄을 제거합니다( unless
와 동의어 if not
).
raku -ne '.put unless /^ \d | \d ** 4..8 $ /;'
입력 예:
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
fd_tr_mn_0716
fd_tr_mn_09013
fd_tr_mn_092433
fd_tr_mn_1020333
fd_tr_mn_12013332
dsdas_1
dsdas_12
dsdas_212
sdasd_4567
weqwe_32323
dasds_232322
2321321_rewrwe_3233
32_Ff
asdasd_1_fff
예제 출력:
chs_de_le_q1gg
fd_tr_mn_0
fd_tr_mn_06
fd_tr_mn_070
dsdas_1
dsdas_12
dsdas_212
asdasd_1_fff
fd_tr_mn_123456789
참고: 위의 방법은 8자리 숫자가 줄 끝 부분에 인접해 있기 때문에 줄을 제거합니다 . $
OP가 숫자 문자열을 유지하려는 경우보다 낫다줄 끝에 인접한 8자리 숫자, 다음 정규식이 유효합니다.
raku -ne '.put unless /^ \d | \D\d ** 4..8 $ /;'
위와 같은 줄은 fd_tr_mn_123456789
반환 시 유지됩니다.