2009-06-22 2 views
2

私はファイルを収集するためにfindやgrepを使うことを考えていますが、変更を加えるためにsedを使用するのですが、出力をどうすればいいですか?または、vimで "argdo"を使用する方が良いでしょうか?bashコマンドラインを使用して、 "import package.name。*;"を追加する方法多くのJavaファイルに?

注:この質問は、IDEではなくコマンドラインソリューションを求めています。 IDEが静かに、丁寧に、そして穏やかに旗を立てることを示唆する回答とコメント。 :-)

答えて

1

あなたは、ファイルの最初の行の前に行を挿入するためにsedを使用することができます。

sed -ie "1i import package.name.*;" YourClass.java 

すべてのファイルを反復処理し、その上にこの式を実行するためのforループを使用します。 importステートメントはパッケージ宣言の後になければならないので、パッケージを持っている場合は注意してください。その場合は、より複雑なsed式を使用することができます。

+0

これは、 "1i"と "インポート"の間の重要でない空白を除いて、混乱の答えを見てから思いついたものです。私はそれが許されているか分からなかった - それははるかに明確である。 sedは、sed -ie "/^package/a import package.name。*;"のように、マッチした行の後ろに追加することができます。 Eg.java#しかし、それは最初のものだけでなく、packageで始まる他の行にもマッチします... – 13ren

1

私はsed -iを提案して、出力を心配する必要はありません。プラットフォームを指定していないので、マニュアルページを確認してください。 sed -iのセマンティクスはLinuxからBSDまで異なります。

+0

おかげで、私は知りませんでした。 (元のファイルに出力をリダイレクトしようとしましたが、長さはゼロになります)。 – 13ren

1

「最初の行のみを行う」という適切な方法があればsedを使用しますが、私は頭の上から1つ分だけわかりません。なぜperlを使わないのでしょうか。次のようなもの:

find . -name '*.java' -exec perl -p -i.bak -e ' 
    BEGIN { 
     print "import package.name.*;\n" 
    }' {} \; 

ジョブを実行する必要があります。詳細についてはperlrun(1)を確認してください。

+0

ありがとう、私はこの種のテキスト処理のためにPerlが賢明な選択肢であることに同意します。ただし、挿入部分を実行するのにうんざりします。sed -ie '1i \\ nimport package.name。*;'例:# "1"が最初の行です。 "i"は挿入物です – 13ren

+0

ニース。私はあなたがsedのアドレスとして裸の行番号を使用できるかどうか覚えていませんでした。もう1つの選択肢はawkでしたが、基本的な置換でない場合はperlに向く傾向があります。 –

1

私は、次の

export MYLIST=`find . -type f -name *.java` 
for a in $MYLIST; do 
    mv $a $a.orig 
    echo "import.stuff" >> $a 
    cat $a.orig >> $a 
    chmod 755 $a 
done; 

MVが悪であると最終的には、これはあなたを取得するの巨大なファンです。しかし、私は多くのもののためにこの同じ構成を使用し、それは私の選択のユーティリティナイフです。

更新:このメソッドは、任意のメソッドを使用して行う必要があるファイルもバックアップします。さらに、シェルの機能以外は使用しません。あなたは、頻繁に使用しないツールについて、あなたの記憶をジョギングする必要はありません。それは猿を教えるのに十分簡単です(そして私が持っていると信じています)。そして、あなたは一般に、それを投げ捨てるのに十分なほど賢明です。なぜなら、書き込むのに4秒かかったからです。

+0

私はテンポラリファイルを避けたかったのですが、それはうまくいきます。 – 13ren

+0

その唯一の利点は、シェルの機能から何も必要がないことです。これはbashとkshで動作し、perlや他の愚かな小さなことについてあなたの心をリフレッシュするよりも速いです。 – ojblass

+0

あなたのアップデートの良い点は、副作用としてバックアップすることです。 – 13ren

1
for i in `ls *java` 
do 
    sed -i '.old' '1 i\ 
    Your include statement here. 
    ' $i 
done 

する必要があります。 -iは置き換えを行い、.oldは何か問題が生じた場合に備えて古いファイルを保存します。 (。多分「見つける|グレップのJava」または代わりに何か)、必要に応じて、イテレータ* javaの置き換え

+0

これはmanページの[SUFFIX]部分でなければなりません。 – 13ren

1

あなたはまた、ファイル検索を行うと置き換えるためにedコマンドを使用することもできます。

# delete all lines matching foobar 
ed -s test.txt <<< $'g/foobar/d\nw' 

を参照してください: http://bash-hackers.org/wiki/doku.php?id=howto:edit-ed

0

私は実際にvimで "argdo"を使ってやっています。まず第一に、引数を設定します。

:args **/*.java 

「**」のすべてのサブディレクトリを横断し、「argsが」あなたが引数としてのすべてのそれらのファイルでVimを開始したかのように(引数リストであるようにそれらを設定し、 vimパッケージ1/One.javaパッケージ1/Two.javaパッケージ2/One。例えば、私は私がしたい変換するために必要なコマンドを何でもしてJava)

次にいじる:

:/^package.*$/s/$/\rimport package.name.*;/ 

「/^package.*$/は」普通「の//のアドレスとして機能します/ "それに続く置換。 "/ $ /"はパッケージの行末に一致します。 "\ r"は改行を得ることです。

これをすべてのファイルに対して、argdoを使って自動化することができます。私はヒット「:」それはなるように、上記の行を取得するには、次に上矢印、その後、「argdo」を挿入:

:argdo /^package.*$/s/$/\rimport package.name.*;/ 

このことは、引数リスト内の各ファイルへの変換を適用「argdo」。

このソリューションに関して本当にうれしいのは、危険ではないということです。ファイルを実際に変更していないのですが、私が望んだことを確認するためにそれらを見ることができます。私は特定のファイルを元に戻すことができます。または、実行したことが気に入らなければ終了することができます(BTW:^ nと^ pを:nと:Nにマップしました。さて、私はそれらを ":wa" - "すべて書き込み"ファイルでコミットします。

:wa 

この時点では、依然として特定のファイルを取り消したり、必要に応じてフィニッシュすることができます。

このアプローチは、他のリファクタリング(たとえば、メソッドシグネチャを変更し、それを多くのファイルで呼び出すなど)にも使用できます。


はところで:これは不器用です:「s/$/\rtext/」... Vimのコマンドラインからテキストを追加するためのより良い方法があるに違いありません...

+0

一般的なリファクタリングの場合、IDEを開く場合は正直なところ、Eclipse用のEclipseを使用する必要があります。私は巨大なVIMのバイツです(私のアバターを参照してください)が、私は上記とほとんど同じことを学ぶようにvararg言語をサポートするGUIは本当にあなたの元気になるでしょう。 – ojblass

+0

さて、あなたのアバターを他の誰かから取ってはいけません:-)私はあなたの2番目の文を理解していません: "vararg"を有効にした言語があなたの元に戻すことは何を意味しますか? (私はJavaを使用していますが、非常に頻繁に可変引数を使用しません) – 13ren

関連する問題