脚本

时间:2015-09-05 13:52:41

标签: perl sed

假设我需要删除文件第一行中的每个空格(或任何其他sed的东西,无所谓)。如果我从终端这样做,这将有效:

perl -i -pe 's/ //g if $. == 1' file.txt

但我需要在perl脚本中执行此操作。我可以使用system执行此操作,但我发现不认为这是从perl脚本中对perl进行系统调用的正确解决方案。

有没有办法让这项工作很好,没有明确的文件打开
附:当然,模块可以做到这一点,但我对核心功能很感兴趣 的 P.P.S。我需要在文件上执行这些操作

4 个答案:

答案 0 :(得分:1)

您可以显式编写-p命令行开关的功能,

sub pe {

  my $f = shift;
  local @ARGV = @_;
  local $^I = ""; # -i command line switch
  local $_;

  while (<>) {
    $f->();
    print;
    close ARGV if eof; # reset $. for each file
  }
}

pe(
  sub { s/ //g if $. == 1 },
  "file.txt"
);

答案 1 :(得分:1)

这很有效。

#!/usr/bin/perl

use strict;
use warnings;

my $line = <>;
$line =~ s/ //g;
print $line, <>;

修改 这是就地编辑版本。

use strict;
use warnings;

{
    local $^I = '.bak';
    while (<>) {
        s/ //g if $. == 1;
        print;
    }
}

答案 2 :(得分:0)

这就是你要追求的吗?

$ # Setup
$ for number in {1..9}
> do
>     {
>     echo words are separated by spaces
>     echo lines follow each other
>     echo until the end
>     } > file.$number
> done
$ cat file.1
words are separated by spaces
lines follow each other
until the end
# Change the files
$ perl -i.bak -e 'while (<>) { s/ //g if $. == 1; print; } continue { $. = 0 if eof; }' file.?
# Demonstrate that all files are affected
$ cat file.1
wordsareseparatedbyspaces
lines follow each other
until the end
$ cat file.8
wordsareseparatedbyspaces
lines follow each other
until the end
$ rm -f file.? file.?.bak
$

很容易使代码仅影响第一个文件的第一行(continue块通过在命令行中的每个文件的末尾重置$.来处理它。 / p>

答案 3 :(得分:-1)

使用神奇的<>运算符迭代文件并更改第1行。

你可以试试这个:

while(my $fh=<>){
$fh=~ s/ //g if($.==1);
print "$fh";
}