2012-05-10 96 views
1

我有一個帶有混合shell,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 S,或者是像

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

這可能是更有效的還是要做的第一grep的(至少)在sed腳本,因爲想必你只在第一感興趣腳本的行。 (在另一方面,你爲什麼對sed替代一個/g標誌,如果是這樣的話?)

其實你可能意味着

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

謝謝Tripleee。這要快得多,因爲grep不會用-q搜索整個文件。爲什麼我有/ g?因爲我不知道我在做什麼:)是的,我用你的建議替代方案。請注意,您的替換會添加一個額外的「#!/」,因爲它是在該組中捕獲的。我刪除它。再次感謝。 – tahoar

+0

糟糕;固定。感謝您的注意。 – tripleee

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在那個和你設置。