1

我有一个混合了 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
4

2 回答 2

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的 s,或者类似的东西

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

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

其实你可能是说

    sed -i -r "1s%^(#!/.+/perl.*)$%\1\\${NL}%" "$f"
于 2012-05-10T08:27:13.880 回答
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就可以了。

于 2012-05-10T08:43:25.260 回答