2

findまたはgrepを使用してファイルを収集し、おそらくsedを使用して変更を加えることを考えていますが、出力をどうするか?それとも、vimで「argdo」を使用する方が良いでしょうか?

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

4

7 に答える 7

2

私は次の大ファンです

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秒かかったので、あなたは一般的にそれを捨てるのに十分賢明です。

于 2009-06-22T00:41:46.763 に答える
1

sed -i出力について心配する必要をなくすことをお勧めします。プラットフォームを指定しないので、manページを確認してください。のセマンティクスはsed -iLinuxごとに異なります。

于 2009-06-22T00:25:47.623 に答える
1

「これは最初の行にのみ行う」という適切な方法があれば、sedを使用しますが、頭のてっぺんから1つはわかりません。代わりにperlを使ってみませんか。何かのようなもの:

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

仕事をする必要があります。詳細を確認perlrun(1)してください。

于 2009-06-22T00:34:21.833 に答える
1

sedファイルの最初の行の前に行を挿入するために使用できます。

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

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

于 2009-06-22T00:45:35.180 に答える
1
for i in `ls *java`
do 
  sed -i '.old' '1 i\
  Your include statement here.
  ' $i
done

やるべきです。-i はインプレース置換を行い、.old は何か問題が発生した場合に備えて古いファイルを保存します。必要に応じてイテレータ *java を置き換えます (代わりに 'find . | grep java' など)。

于 2009-06-22T01:01:24.400 に答える
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

于 2009-06-22T07:09:53.723 に答える
0

私は実際にvimで「argdo」を使ってそれをやり始めました。まず、引数を設定します。

:args **/*.java

「**」はすべてのサブディレクトリをトラバースし、「args」はそれらを引数リストに設定します (これらすべてのファイルを引数として vim を起動したかのように、例: vim package1/One.java package1/Two. java パッケージ 2/One.java)

次に、必要な変換を行うために必要なコマンドをいじります。

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

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

これで、argdo を使用して、すべてのファイルに対してこれを自動化できます。「:」を押してから上矢印を押して上記の行を取得し、「argdo」を挿入して次のようにします。

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

この「argdo」は、その変換を引数リスト内の各ファイルに適用します。

このソリューションの本当に優れている点は、危険ではないことです。実際にはまだファイルを変更していませんが、ファイルを見て、意図したとおりに機能したことを確認できます。特定のファイルを元に戻すことができます。または、完了したことが気に入らない場合は終了できます (ところで、^n と ^p を :n と :N にマップしたので、ファイルをすばやくスクートできます)。今、私はそれらを ":wa" - "write all" ファイルでコミットします。

:wa

この時点で、特定のファイルを元に戻したり、必要に応じて修正したりできます。

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


ところで: これは不器用です: " s/$/\rtext/"... vim のコマンドラインからテキストを追加するにはもっと良い方法があるはずです...

于 2009-06-22T17:10:03.263 に答える