1

シェル、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ネストされたを保持することもできます。

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

sedおそらくスクリプトの最初の行にしか関心がないので、スクリプトの最初のgrepを(少なくとも)実行する方が効率的かもしれません。(一方、その場合、なぜ置換に/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を\bPerl script\b実行すると、設定が完了します。

于 2012-05-10T08:43:25.260 に答える