Используя командную строку bash, как добавить «import package.name. *;» на многие файлы Java? - PullRequest
2 голосов
/ 22 июня 2009

Я думаю об использовании find или grep для сбора файлов и, возможно, sed для внесения изменений, но что делать с выводом? Или лучше использовать argdo в vim?

Примечание: этот вопрос задает решения для командной строки, а не IDE. Ответы и комментарии о том, что IDE будут помечены спокойно, вежливо и безмятежно. : -)

Ответы [ 7 ]

2 голосов
/ 22 июня 2009

Я большой поклонник следующих

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;

М.В. это зло, и в конце концов это вас поймает. Но я использую эту же конструкцию для многих вещей, и это мой выбор ножа.

Обновление: Этот метод также создает резервные копии файлов, которые вы должны сделать, используя любой метод. Кроме того, он не использует ничего, кроме функций оболочки. Вам не нужно беспокоиться об инструментах, которыми вы часто не пользуетесь. Это достаточно просто, чтобы научить обезьяну (и поверьте мне, я должен) сделать. И вы, как правило, достаточно мудры, чтобы просто выбросить его, потому что на написание ушло четыре секунды.

1 голос
/ 22 июня 2009

Вы также можете использовать команду 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

1 голос
/ 22 июня 2009
for i in `ls *java`
do 
  sed -i '.old' '1 i\
  Your include statement here.
  ' $i
done

Должен сделать это. -Я делает замену на месте и .old сохраняет старый файл на случай, если что-то пойдет не так. При необходимости замените итератор * java (возможно, вместо этого найдите «find. | Grep java»).

1 голос
/ 22 июня 2009

вы можете использовать sed для вставки строки перед первой строкой файла:

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

Используйте цикл for, чтобы перебрать все ваши файлы и запустить это выражение для них. но будьте осторожны, если у вас есть пакеты, потому что операторы import должны быть после объявления пакета. Вы можете использовать более сложное sed выражение, если это так.

1 голос
/ 22 июня 2009

Я бы использовал sed, если бы был приличный способ сделать это "делай это только для первой строки", но я не знаю ни одного из макушки моей головы. Почему бы не использовать вместо этого Perl. Что-то вроде:

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

должен сделать работу. Проверьте perlrun(1) для получения более подробной информации.

1 голос
/ 22 июня 2009

Я бы предложил sed -i, чтобы избавиться от необходимости беспокоиться о выходе. Поскольку вы не указываете свою платформу, проверьте страницы справочника; семантика sed -i варьируется от Linux к BSD.

0 голосов
/ 22 июня 2009

На самом деле я начал делать это, используя argdo в vim. Прежде всего, установите аргументы:

: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» применяет это преобразование к каждому файлу в списке аргументов.

Что действительно хорошо в этом решении, так это то, что оно не опасно: оно еще не изменило файлы, но я могу посмотреть на них, чтобы подтвердить, что оно сделало то, что я хотел. Я могу отменить определенные файлы или выйти, если мне не нравится то, что они делают (кстати: я сопоставил ^ n и ^ p с: n и: N, чтобы я мог быстро просматривать файлы). Теперь я фиксирую их с помощью файлов ": wa" - "write all".

:wa

На данный момент я все еще могу отменить определенные файлы или отточить их при необходимости.

Этот же подход можно использовать для других рефакторингов (например, изменить сигнатуру метода и обращения к нему во многих файлах).


Кстати: это неуклюже: "s/$/\rtext/" ... Должен быть лучший способ добавить текст из командной строки vim ...

...