2017-07-23 43 views
6

爲了提高可讀性,我的輸入包含多個製表符和空格。我想使用perl -a修改字段,然後以原始格式打印出該行。 (數據來自findup,我展示的重複文件,浪費空間的計數)輸入:「perl -a」能否以某種方式使用原始空白重新加入@F?

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

輸出將現場3轉換爲千字節,這樣的:

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

在我的夢想世界,這將是我的代碼,因爲我可以將Perl來自動重組@F並保留原始空白:

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

在現實生活,加入一個空間似乎是我唯一的選擇:

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

是否有任何自動變量記住分隔符?如果我有這樣的魔法陣列,代碼將是:

perl -lanE 'BEGIN{use List::Util "reduce";} $F[2]=int($F[2]/1024)." KB"; print reduce { $a . shift(@magic) . $b } @F;' 
+2

順便說一句,與單元之間的間隔打印:'打印 「@F」;'' – zdim

回答

9

不,沒有這樣的魔法物體。您可以自己動手完成它雖然

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

的捕捉split的模式意味着的括號,這也回來了,所以你抓到確切的空間。由於空間在數組中,我們現在需要第五個字段。

事實證明,-F具有相同的屬性。感謝Сухой27。然後

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

注:with 5.20.0-F現在意味着-a-a意味着-n」。感謝ysth

+1

-F'(\ S + )''可以用作參數,'say'會給出額外的換行符。 –

+1

@Сухой27哇。謝謝。我想到了這一點,並「回想起」那裏只能使用文字。 (我認爲「回憶」來自'$ /'...?)修正並補充。 – zdim

+1

@piojo更新了答案 - 事實證明,確切地說你正在問什麼。還修復了一個錯誤。 – zdim

1

你可以只找到這一行的正確部分並修改它:

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

在代碼中跳出'\'是非常奇怪的,並且可以使用備用分隔符(例如's!...!...!e'或's {...} {...} e')來避免。 – ikegami

相關問題