Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用系统调用替换perl中excel文件中的一行_Excel_Perl_Sed - Fatal编程技术网

使用系统调用替换perl中excel文件中的一行

使用系统调用替换perl中excel文件中的一行,excel,perl,sed,Excel,Perl,Sed,我需要替换perl脚本中excel文件中的一行。此行包含多列,每列由制表符分隔。 我试过: $data="v1\tv2\tv2"; $data_replace="c1\tc2\t\c3"; $ret = system("sed -i \"s/$data/$data_replace/g\" file.xls"); print $ret; #256 也尝试过,但不起作用: $ret = system("sed -i \"s/\"$data/\"$data_replace\"/g\" file.xl

我需要替换perl脚本中excel文件中的一行。此行包含多列,每列由制表符分隔。 我试过:

$data="v1\tv2\tv2";
$data_replace="c1\tc2\t\c3";
$ret = system("sed -i \"s/$data/$data_replace/g\" file.xls");
print $ret; #256
也尝试过,但不起作用:

$ret = system("sed -i \"s/\"$data/\"$data_replace\"/g\" file.xls");
$ret = system("sed -i \"s/'$data'/'$data_replace'/g\" file.xls");
但是,如果我这样做,它会起作用:

$ret = system("sed -i \"s/aaa/bbb/g\" file.xls");
当我想替换$data变量时,为什么它不起作用? 谢谢。

试试这个

# prepare a \t catch in buffer \(\t\)
$data="v1\(\t\)v2\tv2";
# use catch tab \1 instead of tab
$data_replace="c1\1c2\1\c3";
$ret = system("sed -i \"s/$data/$data_replace/g\" file.xls");
print $ret; #256

第二个sed模式中的\t并不总是“理解”为tab,因此解决方法是在缓冲区中使用来自第一个模式
\(\t\)
的tab catch,在第二个模式中使用它作为
\1
,在这种情况下,在我的数据变量
$data=“v1\tv2\tv2”;,如果v1、v2为“/”(数据包含“/”
,则sed无法识别此字符,因此我使用:

$ret=system(“sed-i\'s#$data#$data#u replace#g\'file.xls”)

为什么要从perl内部调用sed,使用一个不仅直接存在于perl中而且具有相同语法的命令会带来所有变量插值陷阱?另外:请尝试
${data}
${data}
。这将确保perl理解什么是变量名的一部分,什么不是。但我认为,它仍然应该用某种东西来取代模式。事实证明:你的第一个语法对我来说确实很有用。您确定该文件中确实有选项卡,而不是许多编辑器使用的模拟选项卡吗?例如,如果使用编辑器(而不是excel)打开文件,您是否看到这些选项卡?