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

标签 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 *`

显示显示警告

-i used with no filenames on the command line, reading from STDIN.

它会阻止运行其余脚本。

有什么解决办法吗?

实际上我需要运行

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Inside a shell script

我正在使用带有 docker 的 ubuntu。

最佳答案

让我们一步一步地看这个。首先,您运行此 grep 命令:

grep -ril y.yy.yy.y *

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

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

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

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' [list of filenames]

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

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

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

关于linux - shell 脚本内的 perl -p -i -e,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45839283/

相关文章:

linux - 我正在尝试在 linux 上构建一个程序

linux - 如何使用linux在svn服务器中添加文件

linux - sort -k 1,2 如何工作?

windows - Windows 的替代 bash/或在 cygwin 上帮助完成特定任务

node.js - 通过 java 与终端运行进程之间有区别吗?

linux - 如何在复杂的文本文件中替换 shell 变量

linux - 比较数十万个文件并在 bash 中创建输出结果文件的最快方法

C++ 无法链接 Boost 库

linux - 如何修复无法链接/usr/bin/gradle ->/etc/alternatives/gradle :/usr/bin/gradle exists and it is not a symlink

bash - Docker/bin/sh 未找到二进制 go 文件