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

时间:2012-05-10 06:33:45

标签: linux bash find

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

感谢How to insert newline character after comma in `),(` with sed?我提出了使用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

2 个答案:

答案 0 :(得分:1)

你有很多无用的Grep -c。见http://porkmail.org/era/unix/award.html

#! /bin/bash

NL='
$|++'

for f in `find "$1" -type f`
do
    grep -qP "^\#\!/.+/perl" "${f}" &&
    ! grep -q "$|" "${f}" &&
    sed -i -r "s/^#!\/(.+)\/perl(.+)$/#!\/\1\/perl\2\\${NL}/g" "${f}"
done

短路&&不是优化,只是个人偏好。您也可以保留嵌套的if,或者类似

    if grep -qP "^#!/.+/perl" "$f" && ! grep -q "$|" "$f"; then ...

sed脚本中执行第一个grep(至少)可能更有效率,因为可能您只对脚本的第一行感兴趣。 (另一方面,如果是这种情况,为什么/g替换上有sed标志?)

其实你可能意味着

    sed -i -r "1s%^(#!/.+/perl.*)$%\1\\${NL}%" "$f"

答案 1 :(得分:0)

您也可以使用file(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并且你已经设置了。