我想用$ 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很简单,但是我有不同行的文件,应该替换每一行。 如果您有个更好的主意,请让我知道。 预先感谢。
答案 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)