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 ifif
)|第二个-i
用于在位编辑,它需要一个文件名来备份文件:-i.bck
和i
这是输入文件的名称。尝试删除-i
?请尝试缩小范围。它在shell脚本之外工作吗?如果不是,这是一个问题,命令和“shell脚本中的perl-p-i-e”
在正则表达式模式中具有特殊意义。我很确定x.xx.xx.y
应该是x\.xx\.xx\.y
。首先,为什么要使用grep
只是为了在Perl之前进行检查,以替换您的模式?(=in-placeifif
)| 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'{}+