2012-05-10 10 views
1

私はシェルとPerlとPythonスクリプトが混在したLinuxフォルダツリーを持っています。一貫したファイル拡張子(.pl、.perl、.py、.sh、または全く拡張子なし)を持つスクリプトはありません。どのファイルがPerlスクリプトであるかを特定し、その変数がPerlスクリプトにない場合は、新しいコード行を追加して変数を設定する必要があります。Bashスクリプトで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 

答えて

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秒を維持する、または多分、おそらくあなたが最初にのみ関心があるので、それはsedスクリプトで(少なくとも)最初のgrepを行うことをより一層効率的であるかもしれない

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

のようなものでしたスクリプトの行。 (その場合は一方で、なぜあなたは sed置換に /g旗を持っているのですか?)

実際にあなたは、おそらくあなたはまた、file(1)のコマンドを使用でき

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

ありがとうTripleee。これは、grepが-qでファイル全体を検索しないため、はるかに高速です。なぜ私は/ gを持っていたのですか?私が何をしているのか分からなかったので:)はい、あなたの提案した選択肢を使用しました。あなたの置換は、グループ内で捕捉されたため、余分な "#!/"を追加することに注意してください。私はそれを削除した。再度、感謝します。 – tahoar

+0

一定。気づいてくれてありがとう。 – tripleee

0

意味:

$ 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に設定すると設定されます。

関連する問題