1

この一見単純な質問に対する解決策を見つけることができませんでした:複数行の変数から数行を削除するにはどうすればよいですか?

私はこの種のものをExpectから取り戻しているので、少し整理する必要があります

$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 ~ $

空白、私は対処できると思います:)

みんな、ありがとう!

4

5 に答える 5

2

いつでも正規表現の置換を使用できます。

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

\s*改行だけでなく、おそらく望ましくない他の空白にも一致します。^行頭アンカーと$行末アンカー。/m修飾子を使用すると、アンカーを文字列内の行の開始/終了 (改行など) で一致させることができます。

于 2013-02-15T12:08:00.337 に答える
0

like の正規表現s/^[^\S\n]*\n//gmは、空白のみを含むすべての行を削除します。

アップデート

空白行を削除する以上のことをしたい場合はsplit、文字列を行に分けて、不要なものを削除するのが最善です。このコードはgrep、すべて空白の行をpop削除してから、最後の行を削除するために使用します。

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
于 2013-02-15T12:12:53.733 に答える
0

このperlmonksの回答から

$var =~ s/(^|\n)[\n\s]*/$1/g;

ただし、これを行う方法はたくさんあります。私の意見では、空白行をループして削除するだけで問題はありません。

于 2013-02-15T12:13:30.700 に答える
0

単一行の文字列の場合と同じように空白を削除し、末尾に改行を追加するだけです。

$var =~ s/^\s+//;  # Trim whitespace from beginning of string
$var =~ s/\s+$//;  # Trim whitespace from end of string
$var .= "\n";      # Add terminating newline
于 2013-02-15T12:14:00.850 に答える
-1

正規表現を使用しない別のソリューションのためchompに、ループで使用できます。

for ( 1 .. 2 ) {
    1 while chomp $var;
    $var = reverse $var;
}
于 2013-02-15T12:06:47.013 に答える