Belirli bir uzunluktaki dosyalardaki satırları nasıl belirleyebilirim


12

Kodumda belirli bir uzunluğu aşan satırlar bulmak istiyorum. Kodum birden fazla dosyada. Bunu yapmanın iyi bir yolu nedir?

Dosyaları ve satır numaralarını bilmek istiyorum; içerik tercih edilir, ancak gerekli değildir. Egzersizin amacı daha sonra çizgilerin nasıl kırılacağını bulmaktır (muhtemelen manuel olarak).


Sonuçları nasıl istiyorsunuz? Satırların kendisi (içeriği, olduğu gibi grep) veya satır numaraları olarak veya başka bir şey olarak (belki de onlara başka bir eylem uygulamak istersiniz)? Muhtemelen bunu yapmanın en uygun yolu, bu satırlarla ne yapılacağına bağlıdır.
imz - Ivan Zakharyaschev

@ imz - IvanZakharyaschev İyi bir nokta. Soru güncellendi.
Marcin

Yanıtlar:


13

İle grep:

grep -En '.{12}' file

En az 12 karakter uzunluğunda satırlar için.

Birkaç dosya ile:

find . -type f -exec grep -En '.{12}' {} +

grepGNU gibi bazı uygulamalar grepdosya bulmayı kendileri yapabilir.

grep -rEn '.{12}' .

Ancak sembolik bağlantılara ve diğer normal olmayan dosyalara dikkat edin.


Bunu sevdim çünkü basit ve böyle bir şey yapmayı umuyordum (hala etrafta olmadı).
Marcin

12

AWK çözümü

awk '{       
if (length($0) > 5)
        print $0;'} yourfile

Veya daha kısaca:

awk 'length > 5' file

9
awk 'length > 5'
Sürümünüzü

Gnouc bir küme ayracı katil;)
Ouki

1
+1 içinawk 'length > 5'

3
GNU awkile biraz daha az zarif ama özlüawk '/^.{6,}/'
iruvar

3
@ 1_CR, Bu POSIX ve kısaltılabilir awk '/.{6}/'(yakın zamana kadar GNU awk, POSIXLY_CORRECT ortamına geçmedikçe işe yaramayacak olana kadar).
Stéphane Chazelas

5

Eksik olan tek şey bir sedçözüm olduğundan

sed -n '/^.\{6,\}/p' file

5

Bash çözeltisi

#!/bin/bash

count=0

while read; do
    ((++count)) 
    len=${#REPLY}
    if ((len > 80)); then
        echo "Line $count is $len characters."
    fi
done

Yani, ör ./whatever.sh < input.file. Bu, 1'den $len; bu istenmiyorsa veya girdiniz CRLF sonları kullanıyorsa, buna göre ayarlamanız gerekir.


1
neden çatal ${#line}kaçınmak değil expr?
iruvar

1
ha ha, saf bashçözüm için +1 . Ancak IFS=, önünüze yapışmadıkça read, önde gelen alanların yok sayılacağını unutmayın.
iruvar

1
Birkaç bash iyi uygulamalarında eklendi. Ayrıca lütfen yeni satırın alınmadığına dikkat edin $line.
iruvar

2
@ 1_CR aslında readokumak için bir ad vermezseniz REPLY, tüm boşlukları okuyacak ve içerecektir. Hiçbir IFSayar gerekli.
kojiro

2
Bu son derece yavaş olacak ve ters eğik çizgi karakterlerini özel olarak ele alacak. while readmetin işleme döngüleri gerçekten kötü bir uygulamadır.
Stéphane Chazelas

4

İle perluzun 80 karakterden daha hatları arıyor seni varsayarak, (örneğin):

Çizgileri görüntülemek için:

$ perl -nle 'print if length > 80' your_file

Satır numarasını görüntülemek için:

$ perl -nle 'print "$.\n" if length > 80' your_file

Ya da her ikisi de:

$ perl -nle 'print "[$.]:  $_\n" if length > 80' your_file

3
-lKomut satırı eklemelisiniz perl, satırlarınızdaki satır sonunu sayar.
cuonglm

1

Ruby:

ruby -lne 'puts $_ if $_.size > 5' intputfile

Python:

python -c "import sys;[ sys.stdout.write(''.join(line)) for line in sys.stdin if len(line.strip()) > 5 ]" < inputfile

1

İşte başka bir bash çözümü (bash 4):

minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
                         # Start the array at index 1
for i in "${!MAPFILE[@]}"; do
  (( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done

Ortaya çıkan dizi seyrek olduğundan dizi dizinleri korunur. 1'de başladığımızdan beri, endeksler tuttuğumuz çizgilerin satır numaralarıdır. Yalnızca bu satır numaralarını verebiliriz:

printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo

Veya çizgileri kendileri çıkarabiliriz:

printf '%s\n' "${MAPFILE[@]}"
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.