XY보다 짧은 라인을 제거하는 방법?


29

2048자를 초과하는 줄을 제거하는 방법에 대한 질문을 찾았습니다.

XY보다 길면 줄을 삭제하는 방법은 무엇입니까?

Q : 그러나 4 자보다 짧은 줄을 어떻게 제거 할 수 있습니까? 따라서 파일에서 길이가 1 또는 2 또는 3 인 줄을 제거하십시오.

업데이트 : 많은 GOOD 답변에 감사드립니다.하지만 하나만 OK로 표시 할 수 있습니다

답변:


42

사용할 수 있습니다 sed. 다음은 길이가 3 자 이하인 줄을 제거합니다.

sed -r '/^.{,3}$/d' filename

파일의 변경 사항을 제자리에 저장하려면 -i옵션을 제공하십시오 .

사용중인 버전이 sed확장 RE 구문을 지원하지 않는 경우 BRE로 동일하게 작성할 수 있습니다.

sed '/^.\{,3\}$/d' filename

모든 sed변형에서 작동합니다 .


당신은 또한 사용할 수 있습니다 awk:

awk 'length($0)>3' filename

사용 perl:

perl -lne 'length()>3 && print' filename

sed '/^.\{,3\}$/d'BSD sed :에서는 작동하지 않습니다 sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). sed -r 버전은 구문 상 유효하지만 행을 제거하지는 않습니다.
Dereckson

5

더 많은 변형 :

grep .... file

또는

sed '/..../!d' file

또는

sed -n 's/./&/4p' file

또는

awk 'gsub(/./,"&")>3' file

또는

awk 'length>3' file

또는 GNU awk :

awk 'NF>3' FS= file

1
아 그 grep .... 너무 우아합니다!
grofte

3

다음은 Vim의 Ex 모드와 global명령을 사용하는 Vim 솔루션 입니다.

이는을 사용하는 것과 매우 유사하며 sed일부 특수 문자 ( '{', '}') 만 이스케이프해야합니다.

:g/^.\{,3\}$/d

Vim의 Very Magic Regex 모드 (\ v)를 사용하면 이탈을 피할 수 있습니다.

:g/\v^.{,3}$/d

또한보십시오 : 마법을 도와주세요

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

또한 때때로 유용한 것은와 반대의 작업을 수행하는 것입니다 vglobal.

:v/\v^.{,3}$/d

3 자까지 줄을 제외한 모든 것을 삭제합니다.


1

할 수있는 줄을 직접 제거하십시오.

sed -ri '/.{4}/!d' /path/to/file

또는 BRE :

sed -i '/.\{4\}/!d' /path/to/file

행에 4 개 이상의 문자가 포함되어 있지 않으면 삭제됩니다.

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

명령 대체 서브 쉘에서 위의 작업을 수행하면 grepcat이 쓰기를 시작하기 전에 읽기 디스크립터를 <<HEREDOC확보 할 수 있지만 결과는 계속 스트리밍되어 인수 길이 오류가 발생하지 않습니다.



0

당신은 사용할 수 있습니다 grep:

줄 길이에서 선행 공백을 세는 경우 :

grep -e '[^\ ]\{4,\}' file

줄거리에서 선행 공백을 계산하지 않는 경우 :

grep -e '[^\]\{4,\}' file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.