Linux 如何使用Bash脚本仅在perl脚本中插入一行新代码
我有一个混合了shell、Perl和Python脚本的Linux文件夹树。所有脚本都没有一致的文件扩展名(.pl、.perl、.py、.sh,或者根本没有扩展名)。我需要确定哪些文件是Perl脚本,然后添加一行新代码来设置变量(如果变量不在Perl脚本中) 多亏了,我想出了这段代码,它使用sed插入新的代码行 这段代码可以工作,但是有没有更有效的方法呢Linux 如何使用Bash脚本仅在perl脚本中插入一行新代码,linux,bash,find,Linux,Bash,Find,我有一个混合了shell、Perl和Python脚本的Linux文件夹树。所有脚本都没有一致的文件扩展名(.pl、.perl、.py、.sh,或者根本没有扩展名)。我需要确定哪些文件是Perl脚本,然后添加一行新代码来设置变量(如果变量不在Perl脚本中) 多亏了,我想出了这段代码,它使用sed插入新的代码行 这段代码可以工作,但是有没有更有效的方法呢 #! /bin/bash NL=' $|++' for f in `find "$1" -type f` do if [ $(gre
#! /bin/bash
NL='
$|++'
for f in `find "$1" -type f`
do
if [ $(grep -cP "^\#\!/.+/perl" "${f}") -gt 0 ]
then
if [ $(grep -c "$|" "${f}") -eq 0 ]
then
sed -i -r "s/^#!\/(.+)\/perl(.+)$/#!\/\1\/perl\2\\${NL}/g" "${f}"
fi
fi
done
在这里,Grep-c有许多无用的用途。看 短路
&&
不是优化,只是个人偏好。如果s或者类似的东西,您也可以保留嵌套的
if grep -qP "^#!/.+/perl" "$f" && ! grep -q "$|" "$f"; then ...
在sed
脚本中执行第一个grep(至少)可能更有效,因为您可能只对脚本的第一行感兴趣。(另一方面,如果是这样,为什么在sed
替换上有/g
标志?)
实际上你可能是说
sed -i -r "1s%^(#!/.+/perl.*)$%\1\\${NL}%" "$f"
在这里,Grep-c有许多无用的用途。看
短路&&
不是优化,只是个人偏好。如果
s或者类似的东西,您也可以保留嵌套的
if grep -qP "^#!/.+/perl" "$f" && ! grep -q "$|" "$f"; then ...
在sed
脚本中执行第一个grep(至少)可能更有效,因为您可能只对脚本的第一行感兴趣。(另一方面,如果是这样,为什么在sed
替换上有/g
标志?)
实际上你可能是说
sed -i -r "1s%^(#!/.+/perl.*)$%\1\\${NL}%" "$f"
您还可以使用文件(1)
命令:
$ head -n 1 perl_script_wo_ext
#!/usr/bin/perl
$ file perl_script_wo_ext
perl_script_wo_ext: Perl script, ASCII text executable
然后在其中grep for\bPerl script\b
,您就完成了设置。您还可以使用文件(1)
命令:
$ head -n 1 perl_script_wo_ext
#!/usr/bin/perl
$ file perl_script_wo_ext
perl_script_wo_ext: Perl script, ASCII text executable
然后用grep搜索\bPerl script\b
,您就可以完成设置了。谢谢您。这要快得多,因为grep不使用-q搜索整个文件。为什么我有/g?因为我不知道我在做什么:)是的,我使用了你建议的替代方案。请注意,您的替换添加了一个额外的“#!/”,因为它是在组中捕获的。我把它拿走了。再次感谢。哎呀;固定的。谢谢你的关注,谢谢你,特里皮。这要快得多,因为grep不使用-q搜索整个文件。为什么我有/g?因为我不知道我在做什么:)是的,我使用了你建议的替代方案。请注意,您的替换添加了一个额外的“#!/”,因为它是在组中捕获的。我把它拿走了。再次感谢。哎呀;固定的。谢谢你的注意。