如何删除最后的特殊字符?

时间:2013-08-19 10:20:45

标签: regex perl bash chomp

我的程序中有以下代码,目的是返回安装的Debian版本和subversion。 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(和chop)为什么切断了换行符?为什么要输出这个额外的换行符?

2 个答案:

答案 0 :(得分:3)

chomp更改了字符串,它不会返回更改后的字符串,而是会删除字符数。

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

答案 1 :(得分:0)

试试这样:

  

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