文件包含:
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”的文件,因此应该更容易。我只是不太熟悉语法。谢谢!
答案 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