从 php 脚本执行 sed

问题描述 投票:0回答:1

我的 php 脚本中有以下几行:

$onecount=exec('grep -oi "STRING1" FILE1 | wc -l');
$boo=$onecount;
echo($boo);
exec("sed -i 1,20s/STRING2/$boo/ FILE2");

当我执行这个程序时,它显示数字 27,这是 $onecount 的正确值(因此也是 $boo)的正确值,即 STRING1 在 FILE1 中出现的次数。因此,我希望 FILE2 的前 20 行中 STRING2 的所有实例都替换为“27”。事实上什么都没有改变。

但是:
当我将上面的第二行从

$boo=$onecount;
到,说,
$boo=3;
然后一切都按预期工作:程序既显示数字 3,又正确地将 FILE2 中 STRING2 的所有实例更改为字符串“3”。

当我设置 $boo=3 时,一切都按预期工作,这一事实告诉我(我认为)我的 sed 命令的语法没有问题。

另一件事不起作用:我尝试用 strvalue($onecount) 之类的东西替换 $onecount,但问题仍然存在。

我错过了什么?

php sed exec
1个回答
0
投票

因此,我希望 FILE2 的前 20 行中 STRING2 的所有实例都被“27”替换

如果是这种情况,那么您应该在第一个

trim
命令的输出上调用
exec

$onecount = exec('grep -oi "STRING1" FILE1 | wc -l');
$boo = trim($onecount);

否则字符串前面会有空格:

var_dump($boo)

->

string(8) "      27"

正如您所看到的,该字符串的前面有空格字符,这听起来就像您想要的。

事实上什么都没有改变。

当我将上面的第二行从 $boo=$onecount; 更改为比如说,$boo=3;然后一切都按预期进行...

您可能需要的语法是:

exec("sed -i '1,20s/STRING2/$boo/' FILE2");

或者如果您使用的是 Mac:

exec("sed -i -e '1,20s/STRING2/$boo/' FILE2");

注意包裹正则表达式的撇号被传递到 sed:

'1,20s/STRING2/$boo/'

如果我们把它放在一起,它会给我:

<?php

    $onecount = exec('grep -oi "STRING1" FILE1 | wc -l');
    $boo = trim($onecount);

    var_dump($boo);

    exec("sed -i '1,20s/STRING2/$boo/' FILE2");

    # for mac - see: https://stackoverflow.com/a/19457213/3080207
    //exec("sed -i -e '1,20s/STRING2/$boo/' FILE2");

如果我要理解你原来的问题,这似乎符合意图。

© www.soinside.com 2019 - 2024. All rights reserved.