perl 找到特定字符后删除字符串

xpcnnkqh  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(388)

我的Perl程序只删除字符串的最后三个字符。目前,我正在寻找一种方法来找到包括+的计数,并使用substr或(如果Perl中有任何内置函数的话)来删除。

open my $hfile, $ARGV[0] or die "Can't open $ARGV[0] for reading: $!";
while( my $line = <$hfile> ){
   if ($line =~ /+/){
       $line = substr($line, -3);
       print $line;
   }
}
close $hfile;

输入档

hello_aba+32
gaww_ajnd_arhb+176
ajnbjsdsjn+416

输出档案

hello_aba
gaww_ajnd_arhb
ajnbjsdsjn
zpjtge22

zpjtge221#

这是perl一行程序的经典任务。在删除控制字符后的字符时,我会使用一些警告。首先,将其固定到行尾。其次,确保只删除预期的字符。
假设要删除的字符1)不包括加号+,2)不包括换行符,我会写:

perl -pe' s/\+[^+\n]*$// ' file.txt

[^ ... ]是一个字符类,它与^求反,表示“匹配与内部内容不匹配的任何字符”。
虽然+后面什么都不跟可能被认为是一个文字加号而不是一个 meta字符,我认为转义它\+是正确的,并防止未来的更新错误。确保行的其余部分不包含+确保任何额外的加号不会导致我们丢失数据,例如:

if foo = 2, then foo + bar = 4+123
#                    ^ first  ^ second

添加$作为行尾会将匹配项固定到行尾。这将防止任何额外的+符号扰乱我们的输入。否则它将删除找到的前两个加号之间的内容。
由于我们没有删除行尾\n,因此文件结构保持不变。
演示:

$ cat plus.txt
hello_aba+32
gaww_ajnd_arhb+176
ajnbjsdsjn+416
foo + bar = 3+123

$ perl -pe' s/\+[^+\n]*$//' plus.txt
hello_aba
gaww_ajnd_arhb
ajnbjsdsjn
foo + bar = 3

如果要更改输入文件,可以使用重定向:

$ perl -pe ..... > newfile.txt

或者添加-i开关以执行就地编辑:

$ perl -pi.bak -e ....

.bak将创建扩展名为.bak的备份文件)。请注意,原始文件将被覆盖,因此请谨慎使用。

q9yhzks0

q9yhzks02#

要删除行中“+”后面的任何内容,请使用替换正则表达式:

$line =~ s/\+.*// && print $line;

相关问题