私はファイルを収集するためにfindやgrepを使うことを考えていますが、変更を加えるためにsedを使用するのですが、出力をどうすればいいですか?または、vimで "argdo"を使用する方が良いでしょうか?bashコマンドラインを使用して、 "import package.name。*;"を追加する方法多くのJavaファイルに?
注:この質問は、IDEではなくコマンドラインソリューションを求めています。 IDEが静かに、丁寧に、そして穏やかに旗を立てることを示唆する回答とコメント。 :-)
私はファイルを収集するためにfindやgrepを使うことを考えていますが、変更を加えるためにsedを使用するのですが、出力をどうすればいいですか?または、vimで "argdo"を使用する方が良いでしょうか?bashコマンドラインを使用して、 "import package.name。*;"を追加する方法多くのJavaファイルに?
注:この質問は、IDEではなくコマンドラインソリューションを求めています。 IDEが静かに、丁寧に、そして穏やかに旗を立てることを示唆する回答とコメント。 :-)
あなたは、ファイルの最初の行の前に行を挿入するためにsed
を使用することができます。
sed -ie "1i import package.name.*;" YourClass.java
すべてのファイルを反復処理し、その上にこの式を実行するためのforループを使用します。 import
ステートメントはパッケージ宣言の後になければならないので、パッケージを持っている場合は注意してください。その場合は、より複雑なsed
式を使用することができます。
私はsed -i
を提案して、出力を心配する必要はありません。プラットフォームを指定していないので、マニュアルページを確認してください。 sed -i
のセマンティクスはLinuxからBSDまで異なります。
おかげで、私は知りませんでした。 (元のファイルに出力をリダイレクトしようとしましたが、長さはゼロになります)。 – 13ren
「最初の行のみを行う」という適切な方法があればsedを使用しますが、私は頭の上から1つ分だけわかりません。なぜperlを使わないのでしょうか。次のようなもの:
find . -name '*.java' -exec perl -p -i.bak -e '
BEGIN {
print "import package.name.*;\n"
}' {} \;
ジョブを実行する必要があります。詳細についてはperlrun(1)
を確認してください。
ありがとう、私はこの種のテキスト処理のためにPerlが賢明な選択肢であることに同意します。ただし、挿入部分を実行するのにうんざりします。sed -ie '1i \\ nimport package.name。*;'例:# "1"が最初の行です。 "i"は挿入物です – 13ren
ニース。私はあなたがsedのアドレスとして裸の行番号を使用できるかどうか覚えていませんでした。もう1つの選択肢はawkでしたが、基本的な置換でない場合はperlに向く傾向があります。 –
私は、次の
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秒かかったからです。
for i in `ls *java`
do
sed -i '.old' '1 i\
Your include statement here.
' $i
done
する必要があります。 -iは置き換えを行い、.oldは何か問題が生じた場合に備えて古いファイルを保存します。 (。多分「見つける|グレップのJava」または代わりに何か)、必要に応じて、イテレータ* javaの置き換え
これはmanページの[SUFFIX]部分でなければなりません。 – 13ren
あなたはまた、ファイル検索を行うと置き換えるために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
私は実際に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のコマンドラインからテキストを追加するためのより良い方法があるに違いありません...
これは、 "1i"と "インポート"の間の重要でない空白を除いて、混乱の答えを見てから思いついたものです。私はそれが許されているか分からなかった - それははるかに明確である。 sedは、sed -ie "/^package/a import package.name。*;"のように、マッチした行の後ろに追加することができます。 Eg.java#しかし、それは最初のものだけでなく、packageで始まる他の行にもマッチします... – 13ren