shell 脚本内的 perl -p -i -e

Raz*_*een 2 linux bash shell perl docker

#!/usr/bin/env bash
DOCUMENT_ROOT=/var/www/html/

rm index.php
cd modules/mymodules/

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Run Code Online (Sandbox Code Playgroud)

显示 显示警告

-i used with no filenames on the command line, reading from STDIN.
Run Code Online (Sandbox Code Playgroud)

它阻止运行其余脚本。

有什么解决办法吗?

其实我需要跑步

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Inside a shell script
Run Code Online (Sandbox Code Playgroud)

我正在使用 ubuntu 和 docker。

Dav*_*oss 5

让我们一步一步来看看。首先,您运行以下grep命令:

grep -ril y.yy.yy.y *
Run Code Online (Sandbox Code Playgroud)

这会递归搜索当前目录中的所有文件和目录。在任何情况下,它都会查找包含字符串“y.yy.yy.yy”的文件,并返回包含此文本的文件列表。

该命令将返回文件名列表或不返回任何内容。

该命令返回的任何内容grep都会作为参数传递给 Perl 命令:

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' [list of filenames]
Run Code Online (Sandbox Code Playgroud)

如果grep返回文件列表,则-p此处的选项意味着列表中每个文件中的每一行(依次)运行该替换,然后打印到新文件。这-i意味着每个旧文件都有一个新文件,并且新文件的名称与旧文件相同(命令运行后旧文件将被删除)。

到目前为止,一切都很好。但是如果grep不返回任何文件名会发生什么?在这种情况下,您的 Perl 命令不会获取任何文件名,这将触发您所看到的错误。

所以我的(第二个)猜测是您的grep命令没有执行您想要的操作,并且返回一个空的文件名列表。grep尝试单独运行该命令,看看会得到什么。

  • 如果 `grep` 可以返回空列表,您可以使用 `grep -ril y.yy.yy.y * | xargs perl -pe's/x.xx.xx.y/dd.dd.ddd.dd/g'` 或 `find . -type f -exec perl -i -0777pe's/x.xx.xx.y/dd.dd.ddd.dd/g if /y\.yy\.yy\.y/i' {} +` (3认同)
  • 我没有看到任何数据通过管道传输到“perl”命令;相反,我看到“grep”命令生成的“预期”文件名列表,该列表可能不会产生任何输出。 (2认同)