2012-05-10 5 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 스크립트의 첫 번째 그렙을 (적어도) 할 여전히 더 효율적으로 될 수

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 for \bPerl script\b을 입력하면 설정됩니다.

관련 문제