XY'den uzunsa satırı silmek nasıl?


21

Örneğin: 2048 karakterden uzunsa bir satırı nasıl silebilirim?


Sed kullanmakta ısrar ediyor musunuz? Bu kolaydır, örneğin python'da. Ve şüphesiz Perl'de daha kolay. Her ne kadar soru çok iyi tanımlanmamış olsa da. 2048'den daha uzun olan tüm satırları kaldırarak bir dosyayı kopyalamak mı?
Faheem Mitha

Yanıtlar:


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

3
Hata mesajını alıyorum sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s)(Mac OS X)
wedi

1
@wedi muhtemelen Mac ile birlikte gelen BSD sürümü yerine GNU sürümünü kurmak istersiniz. Bu, demlemek ile kolaydır
Freedom_Ben

Soru “eğer XY'den uzunsa (örneğin, 2048 karakter)” diyor. O zaman> 2048 olmalı ve => 2048 değil
ajcg

1
@ ajcg,> 2048'dir. Regex'in sonunda 2049 karakteriyle eşleşmesi için fazladan bir süre olduğuna dikkat edin.
forcefsck

@forcefsck ve onu "^" ile götürürseniz daha iyi olmaz mıydı? (
emrinizle

7

İşte 2049 veya daha fazla karakter içeren satırları silen bir çözüm:

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

İfade /.{2049}/d, en az 2049 karakter içeren satırlarla eşleşir ve bunları girdiden siler, çıktıda yalnızca daha kısa çizgi oluşturur.

İle awk, uzunluk 2048 veya daha kısa çizgiler baskı:

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

sedÇözümü tam anlamıyla şununla taklit etmek awk:

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

1
Hata mesajını alıyorum sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s)(Mac OS X)
wedi

1
@wedi Şimdi macOS Mojave'da güncellendi ve test edildi.
Kusalananda

2

Bunun gibi bir şey Python'da çalışmalı.

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

1
Şahsen, @Faheem, cevabını tercih ederim. Bunun sebebi, onu 'x'ten küçük tüm satırları silmek' haline getirmem için çok kolay olmamdı. Python'u her zaman kullanmıyorum, ancak bunu yaptığımda her zaman iyi öğrenmem gerektiğini hissediyorum.
ixtmixilix

@ixtmixilix: Evet, Python gibi tam özellikli bir dil kullanmak oldukça esnektir. Yorumunuz için teşekkürler.
Faheem Mitha

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

+1 Yine -lde gerekli değil.
Joseph R.

Benim için çalışmıyor. Perl v5.16.2. Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1.
wedi

Sen deneyebilirsiniz length($_) > 2048 && print. Zaten lengthbir kısayol length($_).
MaratC

0

Yukarıdaki cevaplar benim için Mac OS X 10.9.5'de çalışmıyor.

Aşağıdaki kod çalışıyor:

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

Sorulmamasına, ancak referans olması için sağlanmış olmasına rağmen, aşağıdaki kodu yerine getirebilirsiniz:

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


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

Ah. Yukarıda önerildiği gibi Mac ile birlikte gelen BSD sürümü yerine GNU sürümünü kurdum. Ancak Kusalananda genişletilmiş regex'i etkinleştirme anahtarını buldu. Öyleyse hala bu sorunun varsa çözümüne devam etmelisin. ;)
wedi

0

Gnu-sed ile, ters eğik çizgileri yazmaktan kaçınmak için -r bayrağını ve açık aralığı tanımlamak için virgül kullanabilirsiniz:

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

ile:

  • x {2049} tam olarak 2049 xs anlamına gelir
  • x {2049,3072}, 2049 - 3072 xs arasındaki anlamlar
  • x {2049,} en az 2049 xs anlamına gelir
  • x {, 2049} en fazla 2049 xs anlamı

Aralıklar için, daha büyük kalıplarla eşleşmemek için aşağıdaki gibi

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.