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 是邪恶的,最终这会得到你。但我在很多事情上都使用了同样的结构,它是我选择的实用刀。

更新:此方法还备份您应该使用任何方法执行的文件。此外,它只使用 shell 的功能。您不必记忆您不经常使用的工具。教一只猴子(相信我我已经做到了)很简单。而且您通常足够明智地将它扔掉,因为它花了四秒钟的时间来写。

于 2009-06-22T00:41:46.763 回答
1

我建议sed -i避免担心输出的需要。由于您没有指定您的平台,请检查您的手册页;sed -i从 Linux 到 BSD的语义各不相同。

于 2009-06-22T00:25:47.623 回答
1

如果有一种体面的方法可以“仅对第一行执行此操作”,我会使用 sed ,但我不知道是否有任何想法。为什么不改用 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”将它们设置为 arg 列表(就好像您启动 vim 时将所有这些文件作为 vim 的参数一样,例如:vim package1/One.java package1/Two. java package2/One.java)

然后摆弄我需要的任何命令来进行我想要的转换,例如:

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

“/^package.*$/”作为其后普通“s///”替换的地址;"/$/" 匹配包行的结尾;"\r" 是换行符。

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

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

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

What is really nice about this solution is that it isn't dangerous: it hasn't actually changed the files yet, but I can look at them to confirm it did what I wanted. I can undo on specific files, or I can exit if I don't like what it's done (BTW: I've mapped ^n and ^p to :n and :N so I can scoot quickly through the files). Now, I commit them with ":wa" - "write all" files.

:wa

At this point, I can still undo specific files, or finesse them as needed.

This same approach can be used for other refactorings (e.g. change a method signature and calls to it, in many files).


BTW: This is clumsy: "s/$/\rtext/"... There must be a better way to append text from vim's commandline...

于 2009-06-22T17:10:03.263 回答