-1

一个文件包含:

    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

4 回答 4

3

简短的回答:

以下是如何仅删除文字“ _xxx”的方法。

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

详细解释:

由于 Perl 以与线路噪音无法区分的代码而闻名,这里是对这些步骤的解释。

-p创建一个看起来像这样的隐式循环:

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

-l有点像“auto-chomp”的行为,但也会在再次打印之前将结束的行放回行上。它比这更复杂,但在最简单的使用中,它会将隐式循环更改为如下所示:

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. 

参考资料:

For future reference, information on the command line switches used in Perl "one-liners" can be obtained in Perl's documentation at perlrun. A quick introduction to Perl's regular expressions can be found at perlrequick. And a quick overview of Perl's syntax is found at perlintro.

于 2012-07-10T20:00:51.830 回答
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;
于 2012-07-10T19:42:21.540 回答
1

也许这可以帮助

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

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

于 2012-07-10T20:00:20.097 回答
0

一种使用方式perl。在第二行 ( $. == 2) 中,从最后一行删除_到行尾:

perl -lpe 's/_[^_]*\Z// if $. == 2' infile
于 2012-07-10T19:37:34.957 回答