【问题标题】:remove last line from multi-lined variable从多行变量中删除最后一行
【发布时间】:2013-02-15 11:57:18
【问题描述】:

找不到这个看似简单的问题的解决方案:如何从多行变量中删除几行?

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

空格,我想我可以应付:)

谢谢大家!

【问题讨论】:

    标签: perl text expect text-manipulation


    【解决方案1】:

    您始终可以使用正则表达式替换:

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

    \s* 将匹配换行符,但也匹配您可能不想要的其他空格。 ^$ 以及行锚的开头和结尾。 /m 修饰符允许锚点在字符串内匹配,在行的开始/结束处(例如在换行处)。

    【讨论】:

    • 这不会删除非空行之前的最后一个空行,因为/$/m 仅匹配before 换行符(或字符串末尾)。
    • @Borodin Huh,这很奇怪。我还发现\z\Z 不适用于/m 修饰符。
    • 我认为这是一个文档错误。 $ 匹配 before 终止换行符和字符串末尾。 $/m 也匹配 any 换行符之前。 \z\Z 对我来说似乎很好 - \Z 具有与没有 /m$ 相同的行为,即字符串的末尾或末尾的换行符之前。 \z 只匹配字符串的结尾。
    【解决方案2】:

    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
    

    【讨论】:

    • 谢谢 borodin,您的解决方案真的帮了我大忙!不过,从变量中简单地删除一行是多么复杂的方法! :)
    • 很高兴为您提供帮助。问题是数据没有组织为“行”,“删除所有空行,加上最后一个非空行”不是一个简单的过程!
    【解决方案3】:

    来自this perlmonks answer

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

    虽然有很多方法可以做到这一点。在我看来,循环和删除空行没有问题。

    【讨论】:

    • 这是一个特别好的空白解决方案,谢谢!关于最后一行删除的任何想法? :)
    • 如果您只想删除最后的尾随换行符,您可以在整个变量上调用 chomp,例如chomp($var)
    • 最后一行的文字怎么样?实际上,我希望删除看起来像画 ~ $\n 的线
    • @drew:查看我的答案的更新,不仅仅是删除空白行
    【解决方案4】:

    您可以像处理单行字符串一样简单地修剪空白并添加终止换行符:

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

    【讨论】:

      【解决方案5】:

      为了不使用正则表达式的不同解决方案,您可以在循环中使用chomp

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

      【讨论】:

      • 这不会影响字符串开头的额外空行。
      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多