2017-12-27 5 views
0

으로 리디렉션합니다. bash 스크립트에서 각 파일에 대해 다음 Perl 명령을 호출하고 Perl 명령의 출력을 해당 파일로 리디렉션하려고합니다.Perl 명령 출력을

Perl 명령은 단순히 removes the comments from the file입니다. 콘솔에 인쇄 할 때 작동하는 것 같습니다. 그러나 각 개별 파일로 출력을 리디렉션하려고하면 파일이 비어있게됩니다. 여기서 내가 뭘 잘못하고 있니?

#!/usr/bin/env bash 

shopt -s globstar 
for file in ./**/*.java; do 
    perl -0pe 's|//.*?\n|\n|g; s#/\*(.|\n)*?\*/##g; s/\n\n+/\n\n/g' "$file" > "$file"; 
done 
+1

팁 :'-0'은 실제로 파일을 slurp하지 않습니다. 대신에 -0777을 사용해야합니다. – ikegami

+0

@ikegami 파일을 한 줄씩 처리 할 수 ​​없었던 이유는 무엇입니까? – rapt

+1

'$/= "\ 0";'('-0')과'$/= undef;'('-0777')의 차이점을 읽어보십시오. 처음에 술을 마시는 사람의 의도는 아닙니다 (항상 그렇지는 않습니다). – ikegami

답변

2

출력을 동일한 파일로 리디렉션하려고합니다. 이것은 작동하지 않습니다. 쉘은 먼저 파일을 열어서 파일을 읽으려고 할 때 펄에서 파일을 읽으려고 할 때 아무 것도 출력되지 않으므로 결과가 출력되지 않습니다.

Perl의 -i 옵션을 사용하여 내부 편집을 수행 할 수 있습니다.

perl -i.bak -0pe 's|//.*?\n|\n|g; s#/\*(.|\n)*?\*/##g; s/\n\n+/\n\n/g' "$file" 

이렇게하면 파일을 직접 편집하고 확장명이 .bak 인 파일의 원본을 가질 수 있습니다. 백업이 필요없는 경우 -i.bak

+0

감사합니다. 이제는 의미가 있습니다! – rapt