使用bash命令行,如何添加“import package.name。*;”很多java文件?

时间:2009-06-22 00:22:02

标签: bash vim command-line refactoring sed

我正在考虑使用find或grep来收集文件,也许是sed进行更改,但是如何处理输出?或者在vim中使用“argdo”会更好吗?

注意:这个问题是要求命令行解决方案,而不是IDE。建议IDE的答案和评论将平静,礼貌和安详地标记。 : - )

7 个答案:

答案 0 :(得分: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是邪恶的,最终会得到你。但是我使用相同的构造来做很多事情,这是我选择的实用刀。

更新:此方法还会备份您应该使用任何方法执行的文件。此外,除了shell的功能外,它不会使用任何东西。您不必为不经常使用的工具慢慢记忆。教一只猴子(并相信我,我有)可以做到这一点很简单。而且你通常足够聪明,因为它需要四秒钟才能完成。

答案 1 :(得分:1)

我建议sed -i避免担心输出。由于您未指定平台,请查看您的手册页; sed -i的语义因Linux而异。

答案 2 :(得分:1)

我会使用sed,如果有一个不错的方式,所以“只为第一行做这个”,但我不知道我的头顶一个。为什么不使用perl。类似的东西:

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

应该做的工作。查看perlrun(1)了解详情。

答案 3 :(得分:1)

您可以使用sed在文件的第一行之前插入一行:

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

使用for循环遍历所有文件并在其上运行此表达式。但是如果你有包,要小心,因为import语句必须在包声明之后。如果是这种情况,你可以使用更复杂的sed表达式。

答案 4 :(得分:1)

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

应该这样做。 -i执行就地替换和.old保存旧文件以防万一出错。根据需要替换iterator * java(可能是'find。| grep java'或者其他东西。)

答案 5 :(得分: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

答案 6 :(得分:0)

我实际上是在vim中使用“argdo”开始做的。首先,设置args:

:args **/*.java

“**”遍历所有的子目录,“args”将它们设置为arg列表(就像你启动vim所有这些文件作为vim的参数,例如:vim package1 / One.java package1 /Two.java package2 / One.java)

然后摆弄我需要的任何命令,例如:

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

“/^package.*$/”充当其后的普通“///”替换的地址; “/ $ /”匹配包的行尾; “\ r”是获取换行符。

现在我可以使用argdo在所有文件上自动执行此操作。我点击“:”,然后uparrow得到上面的行,然后插入“argdo”,它变成:

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

这个“argdo”将该变换应用于参数列表中的每个文件。

这个解决方案的真正好处在于它并不危险:它实际上还没有改变文件,但我可以看看它们以确认它是否符合我的要求。我可以撤消特定文件,或者我可以退出,如果我不喜欢它做的(BTW:我已经将^ n和^ p映射到:n和:N因此我可以快速浏览文件)。现在,我用“:wa” - “写所有”文件提交它们。

:wa

此时,我仍然可以撤消特定文件,或者根据需要对其进行精细处理。

这种方法可以用于其他重构(例如,在许多文件中更改方法签名并调用它)。


顺便说一句:这很笨拙:“s/$/\rtext/”......必须有更好的方法从vim的命令行追加文字......