Автоматическое удвоение значения чисел в строке в нескольких файлах

Я пытаюсь изменить исходный код Java в многочисленных .java файлах, которые содержат строки, подобные этой:

private static final Height biomeHeight = new Height(0.1F, 0.2F);

Их более 75, и я хотел бы найти способ автоматизации удвоение значений 0,1F и 0,2F в нескольких строках. Обратите внимание, что значения 0.1F и 0.2F различны в каждом файле.

Например, в одном файле строка может быть такой:

private static final Height biomeHeight = new Height(0.2F, 0.1F);

В таком случае я бы хотел, чтобы это было:

private static final Height biomeHeight = new Height(0.4F, 0.2F);

Как я могу автоматизировать это?

3
задан 8 May 2015 в 15:55

2 ответа

Вы могли рассмотреть использование perl например.

perl -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' file.java

(?<=Height\() и (?=\);) утверждения нулевой длины или lookarounds, которые ограничивают соответствия определенным регионом между теми разделителями, после которых числовые значения извлечены с помощью групп получения чьи значения $1...$3 может затем управляться в использовании выражения замены sprintf с /e (оцените) модификатор.

Для применения рекурсивно Вы могли использовать find команда, например.

find . -name '*.java' -execdir perl -i'.bak' -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' {} \;

Выполнение его на тестовом файле:

$ perl -i'.bak' -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' bop.txt

затем использование diff подтвердить замену

$ diff bop.txt.bak bop.txt
12c12
<   private static final Height biomeHeight = new Height(8.0F, 0.025F);
---
>   private static final Height biomeHeight = new Height(16F, 0.05F);
1
ответ дан 8 May 2015 в 15:55

Я принимаю все строки, которые Вы хотите изменить, запускаются со строки private static final Height biomeHeight = new Height. Если да, то можно использовать awk:

awk -F'[(,)]' '$1=="private static final Height biomeHeight = new Height"\
{$0=$1"("$2*2"F, "$3*2"F);";}1' file

Объяснение:

  • -F'[(,)]' наборы awkразделитель к символам (, ) и , то, что у нас есть параметры того, что Java функционирует в awk полевой $2 и $3
  • $1=="..." если первое поле равняется строке
    • {$0=$1"("$2*2"F, "$3*2"F);";} переформатируйте новую строку с удвоенными значениями.
  • 1, тот сингл 1 в конце эквивалентно {print $0}, следовательно распечатайте целое (отредактированный или не отредактированные) строка.

Править:

Вышеупомянутое awk оператор только работает когда начало строки точно с private static .... Когда существуют пробелы, мы должны изменить его немного:

awk -F'[(,)]' '$1~/[ ]*private static final Height biomeHeight = new Height/\
{$0=$1"("$2*2"F, "$3*2"F);";}1'

Я сверился с Вашим вставляемым кодом. Посмотрите diff:

$ diff file_old file_new
12c12
<       private static final Height biomeHeight = new Height(8.0F, 0.025F);
---
>       private static final Height biomeHeight = new Height(16F, 0.05F);
3
ответ дан 8 May 2015 в 15:55

Другие вопросы по тегам:

Похожие вопросы: