2013-02-15 49 views
1

找不到這個看似簡單的問題的解決方案:如何從多線變量中刪除幾行?從多線變量中刪除最後一行

我得到這種東西回來的期待和需要neaten它一點點

$var=' 


total 20 
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash 
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff 
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect 
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python 
drew ~ $ 

'; 

這些空行是代表什麼,我有。理想情況下,我想使$ var看起來像這樣:

$var=' 
total 20 
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash 
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff 
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect 
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python 
'; 

感謝您的時間。

編輯:我應該澄清;這個問題對我的重要組成部分,是去除以下行:

drew ~ $ 

空白,我想我可以用:)

感謝大家配合!

回答

0

正則表達式如s/^[^\S\n]*\n//gm將刪除所有隻包含空格的行。

更新

如果你想要做的事不僅僅是刪除空行,那麼最好是split串入行,並刪除你不想要的人。此代碼使用grep刪除全部空白的行,然後刪除最後一行。

my @lines = grep /\S/, split /\n/, $var; 
pop @lines; 
$var = join '', map "$_\n", @lines; 
print $var; 

輸出

total 20 
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash 
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff 
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect 
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python 
+0

感謝你borodin,你的解決方案真的幫助我!多麼簡單的方法來簡單地從一個變量中刪除一行! :) – drew 2013-02-15 14:23:35

+0

很高興提供幫助。問題在於數據不是以「行」的形式組織的,「刪除所有空行,加上最後一個非空行」並不是一個簡單的過程! – Borodin 2013-02-15 15:40:01

-1

對於不使用正則表達式不同的解決方案的原因,你可以在一個循環中使用chomp

for (1 .. 2) { 
    1 while chomp $var; 
    $var = reverse $var; 
} 
+0

在字符串的開頭這不會影響額外的空行。 – dgw 2013-02-15 12:08:32

2

您可以隨時使用正則表達式替換:

$var =~ s/^\s*$//gm; 

\s*會匹配換行符,但也可能是其他您不想要的空格。 ^$以及線錨的開始和結束。 /m修飾符允許錨在線的開始/結束處(例如在換行符處)匹配字符串內部。

+0

這不會刪除非空白行之前的最後一個空白行,因爲'/ $/m'只在*換行符之前(或在字符串末尾)匹配*。 – Borodin 2013-02-15 12:41:43

+0

@Borodin Huh,這很奇怪。我還發現'\ z'和'\ Z'不能用'/ m'修飾符。 – TLP 2013-02-15 12:51:03

+0

我認爲這是一個文檔錯誤。 '$'在*終止換行符和字符串結尾處匹配*。帶'/ m'的'$'也匹配* any *換行符之前。 '\ z'和'\ Z'對我來說看起來很好 - '\ Z'具有與沒有'/ m'的'$'行爲相同的行爲,即字符串的末尾或末尾的換行符之前。 '\ z'只是匹配字符串的結尾。 – Borodin 2013-02-15 12:57:03

0

this perlmonks answer

是$ var =〜S /(^ | \ n)的[\ n \ S] */$ 1 /克;

很多方法可以做到這一點。在我看來,沒有問題只是循環和刪除空白行。

+0

這是一個特別好的解決方案,謝謝!關於最後一行刪除的任何想法? :) – drew 2013-02-15 12:20:43

+0

如果您只想刪除最後的換行符,您可以對整個變量調用chomp,例如 chomp($ var) – 2013-02-15 12:29:34

+0

那最後一行的文字呢?有效地,我想要的行看起來像 德魯〜$ \ n 被刪除 – drew 2013-02-15 12:41:51

0

你可以簡單地修剪空白像你這樣一個單行字符串做,並添加終止新行:

$var =~ s/^\s+//; # Trim whitespace from beginning of string 
$var =~ s/\s+$//; # Trim whitespace from end of string 
$var .= "\n";  # Add terminating newline