如何从perl中的文件中删除特定的单词

时间:2012-07-10 19:31:08

标签: perl unix

文件包含:

    rhost=localhost
    ruserid=abcdefg_xxx
    ldir=
    lfile=
    rdir=p01
    rfile=
    pgp=none
    mainframe=no
    ftpmode=binary
    ftpcmd1=
    ftpcmd2=
    ftpcmd3=
    ftpcmd1a=
    ftpcmd2a=
    notifycc=no
    firstfwd=Yes
    NOTIFYNYL=
    decompress=no
    compress=no

我想写一个简单的代码,删除第二行中的“_xxx”。请记住,永远不会有包含字符串“_xxx”的文件,因此应该更容易。我只是不太熟悉语法。谢谢!

4 个答案:

答案 0 :(得分:3)

答案简短:

以下是如何删除文字“_xxx”。

perl -pli.bak -e 's/_xxx$//' filename

详细解释:

由于Perl具有与线路噪声无法区分的代码的声誉,因此这里是对步骤的解释。

-p创建一个隐式循环,如下所示:

while( <> ) {
    # Your code goes here.
}
continue {
    print or die;
}

-l类似于“自动选择”的行为,但也会在重新打印之前将行结束回行。它比这更复杂,但在最简单的使用中,它将隐式循环更改为:

while( <> ) {
    chomp;
    # Your code goes here.
}
continue {
    print $_, $/;
}

-i告诉Perl“就地编辑”。在幕后它创建一个单独的输出文件,最后它移动该临时文件以替换原始文件。

.bak告诉Perl它应该创建一个名为'originalfile。 bak '的备份,这样如果你犯了一个错误就可以很容易地反转。

替换内部:

s/
    _xxx$     # Match (but don't capture) the final '_xxx' in the string.
 /$1/x;       # Replace the entire match with nothing. 

参考资料:

为了将来参考,有关Perl“one-liners”中使用的命令行开关的信息可以在perlrun的Perl文档中获得。可以在perlrequick找到Perl正则表达式的快速介绍。可以在perlintro找到Perl语法的快速概述。

答案 1 :(得分:1)

这会覆盖原始文件,在第二行中删除_xxx

use warnings;
use strict;
use Tie::File;

my $filename = shift;
tie my @lines, 'Tie::File', $filename or die $!;
$lines[1] =~ s/_xxx//;
untie @lines;

答案 2 :(得分:1)

也许这可以帮助

perl -ple 's/_.*// if /^ruserid/' < file

将删除以“ruserid”开头的行中第一个'_'(包含)之后的任何内容。

答案 3 :(得分:0)

使用perl的一种方法。在第二行($. == 2)中,从上一个_删除直到行尾:

perl -lpe 's/_[^_]*\Z// if $. == 2' infile