Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
Linux shell脚本中的perl-p-i-e_Linux_Bash_Shell_Perl_Docker - Fatal编程技术网

Linux shell脚本中的perl-p-i-e

Linux shell脚本中的perl-p-i-e,linux,bash,shell,perl,docker,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 ST

显示警告

#!/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.

我将ubuntu与docker一起使用。

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

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Inside a shell script
这将递归搜索当前目录中的所有文件和目录。它在任何情况下都会查找包含字符串“y.yy.yy.yy”的文件,并返回包含此文本的文件列表

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

然后,将从
grep
命令返回的任何内容作为参数传递给Perl命令:

grep -ril y.yy.yy.y *
如果
grep
返回一个文件列表,那么这里的
-p
选项意味着列表中每个文件中的每一行都(依次)经过该替换,然后打印到一个新文件中。
-i
表示每个旧文件都有一个新文件,新文件的名称与旧文件相同(一旦命令运行,旧文件将被删除)

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


因此,我(第二)猜测您的
grep
命令没有执行您希望它执行的操作,而是返回了一个空的文件名列表。试着单独运行
grep
命令,看看您得到了什么。

让我们一步一步来看看这个。首先,您正在运行这个
grep
命令:

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Inside a shell script
这将递归搜索当前目录中的所有文件和目录。它在任何情况下都会查找包含字符串“y.yy.yy.yy”的文件,并返回包含此文本的文件列表

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

然后,将从
grep
命令返回的任何内容作为参数传递给Perl命令:

grep -ril y.yy.yy.y *
如果
grep
返回一个文件列表,那么这里的
-p
选项意味着列表中每个文件中的每一行都(依次)经过该替换,然后打印到一个新文件中。
-i
表示每个旧文件都有一个新文件,新文件的名称与旧文件相同(一旦命令运行,旧文件将被删除)

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


因此,我(第二)猜测您的
grep
命令没有执行您希望它执行的操作,而是返回了一个空的文件名列表。尝试单独运行
grep
命令,查看您得到了什么。

尝试删除
-i
?请尝试缩小范围。它在shell脚本之外工作吗?如果不是,这是一个问题,命令和“shell脚本中的perl-p-i-e”
在正则表达式模式中具有特殊意义。我很确定
x.xx.xx.y
应该是
x\.xx\.xx\.y
。首先,为什么要使用
grep
只是为了在Perl之前进行检查,以替换您的模式?(=in-place if
if
)|第二个
-i
用于在位编辑,它需要一个文件名来备份文件:
-i.bck
i
这是输入文件的名称。尝试删除
-i
?请尝试缩小范围。它在shell脚本之外工作吗?如果不是,这是一个问题,命令和“shell脚本中的perl-p-i-e”
在正则表达式模式中具有特殊意义。我很确定
x.xx.xx.y
应该是
x\.xx\.xx\.y
。首先,为什么要使用
grep
只是为了在Perl之前进行检查,以替换您的模式?(=in-placeif
if
)| Second
-i
用于就地编辑,它需要一个文件名来备份文件:
-i.bck
i
这是输入文件的名称。我没有看到任何数据被传输到
perl
命令;相反,我看到了一个由
grep
命令生成的预期文件名列表,它可能不会产生任何输出。@chepner:当然,你是绝对正确的。查看我的更新。如果
grep
可能返回空列表,您可以使用
grep-ril y.yy.yy*| xargs perl-pe的/x.xx.xx.y/dd.dd.dd/g'
find-键入f-exec perl-i-0777pe的/x.xx.xx.y/dd.dd.dd/g如果/y\.yy\.yy\.y/i'{}+
我看不到任何数据通过管道传输到
perl
命令;相反,我看到了一个由
grep
命令生成的预期文件名列表,它可能不会产生任何输出。@chepner:当然,你是绝对正确的。查看我的更新。如果
grep
可能返回空列表,您可以使用
grep-ril y.yy.yy*| xargs perl-pe的/x.xx.xx.y/dd.dd.dd/g'
find-如果/y\.yy\.yy\.y/i'{}+