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


21

예를 들어 2048 자보다 긴 행을 삭제하려면 어떻게해야합니까?


sed 사용을 주장합니까? 예를 들어 파이썬에서는 쉽습니다. 그리고 펄에서도 더 쉬울 것입니다. 질문이 잘 정의되어 있지 않지만. 파일을 복사하여 2048보다 긴 모든 행을 제거합니까?
Faheem Mitha

답변:


22
sed '/^.\{2048\}./d' input.txt > output.txt

3
오류 메시지 sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi

1
@wedi 아마도 Mac과 함께 제공되는 BSD 버전 대신 GNU 버전을 설치하고 싶을 것입니다. 양조하기가 쉽습니다.
Freedom_Ben

질문에 "XY보다 긴 경우 (예 : 2048 자)"가 표시됩니다. 그러면 2048 이상이 아니고 2048 이상이 아니어야합니다.
ajcg

1
@ajcg,> 2048입니다. 정규 표현식 끝에 2049 번째 문자와 일치하는 추가 기간이 있습니다.
forcefsck

@forcefsck 그리고 "^"를 빼면 더 나아지지 않을까요? (명령을 사용하면 "XYZ로 시작하는"행만 제거하지만 XYZ가 다른 행에 있으면 삭제되지 않습니다.
ajcg

7

문자가 2049 개 이상인 행을 삭제하는 솔루션은 다음과 같습니다.

sed -E '/.{2049}/d' <file.in >file.out

표현식 /.{2049}/d은 2049 자 이상을 포함하는 모든 행과 일치하고 입력에서이를 삭제하여 출력에서 ​​더 짧은 행만 생성합니다.

를 사용하면 awk길이가 2048 이하인 인쇄 라인 :

awk 'length <= 2048' <file.in >file.out

sed말 그대로 솔루션을 모방 awk:

awk 'length >= 2049 { next } { print }' <file.in >file.out

1
오류 메시지 sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(Mac OS X)
wedi

1
@wedi 이제 macOS Mojave에서 업데이트 및 테스트되었습니다.
Kusalananda

2

이와 같은 것이 Python에서 작동해야합니다.

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()

1
개인적으로 @Faheem, 나는 당신의 대답을 선호합니다. 그 이유는 내가 x보다 작은 모든 줄을 삭제하는 것으로 바꾸는 것이 매우 쉽기 때문입니다. 나는 항상 파이썬을 사용하지는 않지만, 내가 할 때 항상 잘 배워야한다고 생각합니다.
ixtmixilix

@ixtmixilix : 예. Python과 같은 모든 기능을 갖춘 언어를 사용하는 것은 매우 유연합니다. 의견 주셔서 감사합니다.
Faheem Mitha

2
perl -lne "length < 2048 && print" infile > outfile

+1 -l그래도 필요하지 않습니다.
Joseph R.

나를 위해 작동하지 않습니다. 펄 v5.16.2. Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
wedi

시도해 볼 수 있습니다 length($_) > 2048 && print. 어쨌든 length바로 가기 length($_)입니다.
MaratC

0

Mac OS X 10.9.5에서는 위의 답변이 작동하지 않습니다.

다음 코드가 작동합니다.

sed '/.\{2048\}/d'.

요청되지는 않았지만 참조 용으로 제공되었지만 다음 코드를 역으로 달성 할 수 있습니다.

sed '/.\{2048\}/!d'.


lol, but sed: 1: "/.\{2048\}/d": RE error: invalid repetition count(s)( Mac OS X, 10.10.4)
alex grey

아 위에서 제안한 @Freedom_Ben과 같이 Mac과 함께 제공되는 BSD 버전 대신 GNU 버전을 설치했습니다. 그러나 Kusalananda는 확장 정규식을 활성화하는 스위치를 발견했습니다. 따라서 여전히 문제가 있다면 그의 해결책을 찾아야합니다. ;)
wedi

0

gnu-sed를 사용하면 백 슬래시와 쉼표를 입력하여 열린 간격을 정의하지 않도록 -r 플래그를 사용할 수 있습니다.

sed -r  "/.{2049,}/d" input.txt > output.txt

와:

  • 정확히 2049 xs를 의미하는 x {2049}
  • x {2049,3072}는 2049에서 3072 xs를 의미합니다.
  • x {2049,}는 최소 2049 xs를 의미합니다.
  • x {, 2049} 최대 2049 xs를 의미

간격의 경우 더 큰 패턴과 일치하지 않으려면 다음과 같은 라인 앵커가 필요합니다.

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.