Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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 如何使用Bash脚本仅在perl脚本中插入一行新代码_Linux_Bash_Find - Fatal编程技术网

Linux 如何使用Bash脚本仅在perl脚本中插入一行新代码

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

我有一个混合了shell、Perl和Python脚本的Linux文件夹树。所有脚本都没有一致的文件扩展名(.pl、.perl、.py、.sh,或者根本没有扩展名)。我需要确定哪些文件是Perl脚本,然后添加一行新代码来设置变量(如果变量不在Perl脚本中)

多亏了,我想出了这段代码,它使用sed插入新的代码行

这段代码可以工作,但是有没有更有效的方法呢

#! /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?因为我不知道我在做什么:)是的,我使用了你建议的替代方案。请注意,您的替换添加了一个额外的“#!/”,因为它是在组中捕获的。我把它拿走了。再次感谢。哎呀;固定的。谢谢你的注意。