在Python中,我们可以这样做: p>
< code> pattern =“foo” searchfile =“/ root / text” search =“bar” replace =“baz” mpnmpfile = tempfile.mkstemp()[1] grepcmd = [“/ bin / grep “,” - E“,pattern,searchfile] sedcmd = [”/ bin / sed“,” - E“,”s / {0} / {1} / g“.format(search,replace)] with open(tempfile,“w”)as temphandle: \ grep = subprocess.Popen(grepcmd,stdout = subprocess.PIPE) sed = subprocess.Popen(sedcmd,stdin = grep.stdout,stdout = temphandle) grep .stdout.close() sed.communicate() code> pre>您可以从
grep <中看到
stdout code> / code>命令作为
stdin code>传递给
sed code>命令,该命令又将文件句柄指定为
stdout code>。 这相当于这个shell命令: p>
grep -E foo / root / text | sed -E's / bar / baz / g'&gt; / tmp / whatever code> pre>
我想在PHP中复制这种行为,但我没有找到等效的本机功能。 我一直在做的是将等效的shell命令构建为长字符串并将其传递给
shell_exec() code>,但这很麻烦,特别是正确使用
escapeshellarg() code >(注意上述Python代码中不需要转义。) p>
$ pattern =“foo”; $ searchfile =“/ root / text”; \ n $ search =“bar”; $ replace =“baz”; $ tempfile = tempnam(sys_get_temp_dir(),'asdf'); $ grepcmd =“/ bin / grep -E”。 escapeshellarg($ pattern)。 “”。 escapeshellarg($ searchfile); $ sedcmd =“/ bin / sed -E”。 escapeshellarg(“s / $ search / $ replace / g”); exec(“$ grepcmd | $ sedcmd&gt; $ tempfile); code> pre>
我也可以 分别运行每个命令,捕获变量中的输出,并将其传递给下一个命令,但这显然效率低下。 p>
是否有任何本机方式在PHP中执行类似操作或是我的 当前的方法和它一样好吗? p> div>