XY'den kısa çizgiler nasıl kaldırılır?


29

2048 karakterden daha uzun satırları nasıl kaldıracağımla ilgili bir soru buldum:

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

S: Ama 4 karakterden kısa çizgileri nasıl kaldırabilirim? Bu nedenle, bir dosyada 1 veya 2 veya 3 uzunluğa sahip satırları kaldırın.

GÜNCELLEME: Pek çok İYİ cevap için teşekkürler, ancak yalnızca bir tanesini işaretleyebilirim

Yanıtlar:


42

Kullanabilirsiniz sed. Aşağıdaki, 3 karakter uzunluğunda veya daha küçük olan satırları kaldırır:

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

Değişiklikleri dosyaya yerinde kaydetmek için -iseçeneği belirtin.

Sürümünüz sedgenişletilmiş RE sözdizimini desteklemiyorsa, aynısını BRE'ye de yazabilirsiniz:

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

tüm seddeğişkenlerle çalışır.


Ayrıca awkşunları da kullanabilirsiniz :

awk 'length($0)>3' filename

Kullanarak perl:

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

sed '/^.\{,3\}$/d'BSD sed ile çalışmaz sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s). Sed -r sürümü sözdizimsel olarak geçerlidir, ancak satırları kaldırmaz.
Dereckson

5

Biraz daha varyasyon:

grep .... file

veya

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

veya

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

veya

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

veya

awk 'length>3' file

veya GNU awk:

awk 'NF>3' FS= file

1
Ah bu grep .... çok zarif!
grofte

3

İşte Vimin Ex modunu ve globalkomutunu kullanan Vim çözümü .

Bu, kullanıma çok benzer sed, sadece bazı özel karakterlerin ('{', '}') kaçması gerekir.

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

Vim’in Very Magic Regex modunu (\ v) kullanarak, bu kaçmayı önleyebilirsiniz.

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

Ayrıca bakınız: sihire yardım et

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"

Ayrıca bazen yararlı olanlarla tam tersi yapmaktır vglobal.

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

3 karaktere kadar satırdan başka her şeyi silecekti.


1

doğrudan yapabileceğiniz satırları kaldırmak için:

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

Veya BRE:

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

Bir satır 4 veya daha fazla karakter içermiyorsa silinir.

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

Yukarıdakileri komut yerine koyma alt kabuğu içinde yapmak, grepkedi yazmaya başlamadan önce üzerinde bir okuma tanımlayıcısı almasını sağlar, ancak <<HEREDOCsonuç, akışlı kalmasını ve argüman uzunluğu hatalarına neden olmamasını sağlar.



0

Kullanabilirsiniz grep:

Satır uzunluğunda baştaki boşlukları sayarsanız:

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

Satır boşluğundaki baştaki boşlukları saymazsanız:

grep -e '[^\]\{4,\}' file
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.