2017-12-27 15 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'は実際にファイルをスラップしません。代わりに '-0777'を使うべきです。 – ikegami

+0

@ikegamiどのようにしてファイルを行単位で処理できなかったのですか? – rapt

+1

'$/=" \ 0 ";'( '-0')と' $/= undef; '(' -0777')の違いを読んでください。それは最初の嫌がらせの意図ではありません(常にそうとは限りません)。 – ikegami

答えて

2

ファイルから読み込み、出力を同じファイルにリダイレクトしようとしています。これは動作しません。シェルはまずファイルを書き込み用に開きます。これはPerlがファイルから読み込もうとしたときに存在するものがないため、出力されません。

Perlの-iオプションを使用すると、インプレース編集を行うことができます。

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

これは、ファイルを直接編集し、.bak拡張子のファイルのオリジナルコピーも持っています。バックアップが必要ない場合は、-i.bakの代わりに-iを使用してください。

+0

ありがとうございました!今それは意味をなさない! – rapt

関連する問題