【问题标题】:How do I remove the special character at the end?如何删除最后的特殊字符?
【发布时间】:2013-08-21 02:37:04
【问题描述】:

我的程序中有以下代码,旨在返回已安装的 Debian 的版本和子版本。 shell的输出由变量读取并解析并形成一个字符串。

#!/usr/bin/perl
use warnings;
use strict;
use Scalar::Util qw(looks_like_number);
chomp(my $distver=`cat /etc/issue`);
$distver =~ s/\\n//g;
$distver =~ s/\\/./g;
$distver =~ s/ //g;
our $enpos=-1;
for ( my $i=0; $i <length($distver); $i++ ) {
    if (looks_like_number(substr($distver, $i, 1))) {
        if ( $enpos == -1 ) { $enpos = $i; }
    }
}
print "Distro:".substr($distver, 0, $enpos)."".substr($distver, $enpos);
my $subver=substr($distver, $enpos);
$subver =~ s/\\n//g;
$subver =~ s/\\r//g;
$subver =~ s/\\f//g;
print "Subversion:".$subver."\n";

上面的输出是:

root@der:~# ./distr.pl
Distro:DebianGNU/Linux7.l
Subversion:7.l

在输出中,7.1 之后的末尾有一个额外的换行符。我尝试了上面的正则表达式,试图在最后删除换行符、回车符和换页符,但失败了。

cat /etc/issue 的输出是this

我最初尝试 chomp 从输出中删除换行符,发现不是删除结束换行符,而是这样做:

print "Distro:".substr($distver, 0, $enpos)."".substr($distver, $enpos);
my $subver=chomp(substr($distver, $enpos));
print "Subversion:".$subver."\n";

输出:

root@der:~# ./distr.pl
Distro:DebianGNU/Linux7.l
Subversion:1
root@der:~#

那么为什么会这样呢?为什么 chomp(和chomp)比换行符切断更多?为什么会输出这个额外的换行符?

【问题讨论】:

    标签: regex perl bash chomp


    【解决方案1】:

    chomp原地改变字符串,它不返回改变后的字符串,而是返回删除的字符数。

    要删除换行符,请使用s/\n//g,双反斜杠匹配反斜杠。

    【讨论】:

    • 你能发布/etc/issue的内容吗?
    • @Droidzone:查看更新。
    • @Droidzone:另外,我在粘贴的文件中的任何地方都没有看到子版本。
    【解决方案2】:

    试试这样:

    $distver =~ s/\n.*//s;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 2021-10-11
      相关资源
      最近更新 更多