2017-07-23 21 views
6

Girdim, okunabilirlik için bir sekme ve boşluk içeriyor. perl -a kullanarak bir alanı değiştirmek istiyorum, sonra satırı özgün formunda yazdırmak istiyorum. (. Veri bana çift dosyaları ve onlar israf alanı sayısını gösteren findup dan) Girdi geçerli:"Perl -a" bir şekilde orijinal boşluk kullanılarak @F'yi yeniden birleştirebilir mi?

2 * 4096 backup/photos/photo.jpg photos/photo.jpg 
2 * 111276032 backup/books/book.pdf book.pdf 

çıktı böyle kilobayt alanını 3 dönüştürmek olacaktır:

2 * 4 KB backup/photos/photo.jpg photos/photo.jpg 
2 * 108668 KB backup/books/book.pdf book.pdf 

gerçek ise

perl -lanE '$F[2]=int($F[2]/1024)." KB"; print;' 

: sadece otomatik @F yeniden şekillendirmek üzere perl ve orijinal boşluk koruyacaktır olabilir çünkü benim rüya dünyasında, bu, benim kod olurdu hayat, tek bir boşluk ile birleştirme benim tek seçenek gibi görünüyor: sınırlayıcıları hatırlar herhangi bir otomatik değişken

perl -lanE '$F[2]=int($F[2]/1024)." KB"; print join(" ", @F);' 

var mı? Böyle bir sihir dizim olsaydı, bu kod şöyle olurdu:

+2

Btw, elemanlar arasında bir boşluk yazdırmak için: 'print "@F";' – zdim

cevap

9

Hayır, böyle bir sihirli nesne yoktur. Eğer tam boşlukları yakalamak, böylece

perl -wnE'@p = split /(\s+)/; $p[4] = int($p[4]/1024); print @p' input.txt 

yakalama aynı zamanda döndürülür anlamına split 'ın desende parens olsa elle yapabilirsiniz. Boşluklar dizide bulunduğundan, artık beşinci alana ihtiyacımız var.

Görünüşe göre, -F aynı mülke sahiptir. Сухой27'a teşekkürler. Sonra

perl -F'(\s+)' -lanE'$F[4] = int($F[4]/1024); say @F' input.txt 

Not: with 5.20.0 "-F şimdi -a ve -a-n ima ima". ysth için teşekkürler.

+1

'-F '(\ s +) '' parametre olarak kullanılabilir ve '' ekstra satır verecektir. –

+1

@ Сухой27 Vay. Teşekkür ederim. Bunu düşündüm ve sadece oradaki harfleri kullanabileceğini “hatırladım”. (Sanırım "hatırlama" $/'den geliyor ...?) Sabit ve ekledi. – zdim

+1

@piojo Yanıtı güncelledik - tam olarak ne istediğini görüyoruz. Ayrıca bir hata düzeltildi. – zdim

1

Sadece çizginin doğru parçasını bulup değiştirebilir:

perl -wpE's/^\s*+(?>\S+\s+){2}\K(\S+)/int($1\/1024) . " KB"/e' 
+4

Kaçan '\' oh çok garip ve alternatif ayırıcı kullanılarak önlenebilir (örneğin 's! ...! ...! e' veya' ın {...} {...} e') – ikegami