패턴 일치 후 특정 행 삭제

패턴 일치 후 특정 행 삭제

다음과 같은 파일이 있습니다.

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반환 시 유지됩니다.

https://raku.org

관련 정보