我应该如何在perl中使用系统命令

时间:2019-02-25 10:55:49

标签: perl sed

我想用$ var替换一行。 runnew有

input= input/old/should/change;
replace= input/old/replace;
other = input/old/other;
replace_other= input/old/replace_other;

我的输出文件应该看起来像

 input= input/old/should/New;
replace= input/old/New_replace;
other = input/old/New_other;
replace_other= input/old/New_replace_other;

我想用输入=输入/旧/应该/新来代替“输入=”;  我曾经用过,

if ($#ARGV != 0) {
    die "\n********USAGE <cellname> <tech>********\n"; 
}
$newinput=$ARGV[0];
open(my $fh, "$runnew") or die "Could not open rerun.txt: $!";
while (<$fh>) {
 system ( sed -i "/input=.*/c\input= $newinput" $runnew );
}

但是弹出一个错误消息:“标量在run.pl处找到了运算符所在的位置”,并显示sed行并询问“($ runnew之前缺少运算符?)。” 当我在终端上使用相同的sed替换它的行时。

请问谁能指出错误在哪里?

是的,使用Sed很简单,但是我有不同行的文件,应该替换每一行。 如果您有个更好的主意,请让我知道。 预先感谢。

2 个答案:

答案 0 :(得分:2)

system()将字符串列表作为其参数。您需要在传递的命令前后加上引号。

system ( "sed -i '/input=.*/c\input= $newinput' $runnew" );

但是您的代码仍然看起来很奇怪。您正在为输入文件中的每一行运行完全相同的sed命令。那是你的本意吗?

目前还不清楚您要在这里做什么。但是我相信,最好的方法将涉及使用sed和使用Perl进行转换的

答案 1 :(得分:2)

您为什么要致电sed?直接在Perl中可以轻松满足您的要求:

  • 添加-i.bak以启用就地替换模式
  • 使用第一个命令行参数作为替换字符串
    • @ARGV数组中删除它,因此它不会被解释为文件
  • 循环访问命令行中的所有文件
    • 逐行阅读
    • 应用替换
    • 打印结果

Perl自动负责打开文件,写入正确的文件并将旧文件重命名为.bak

#!/usr/bin/perl -i.bak
use warnings;
use strict;

my($replacement) = shift(@ARGV);

while (<>) {
    s/input=.*/input= $replacement/;
    print;
}

exit 0;

试运行(对输入数据进行有根据的猜测):

$ cat dummy1.txt.bak 
input= test1
input= test2
$ cat dummy2.txt.bak 
input= test3
input= test4

$ perl dummy.pl REPLACEMENT dummy1.txt dummy2.txt

$ cat dummy1.txt
input= REPLACEMENT
input= REPLACEMENT
$ cat dummy2.txt
input= REPLACEMENT
input= REPLACEMENT

或使用文件“ rerun.txt”的内容:

$ perl dummy.pl REPLACEMENT $(cat rerun.txt)