Я пытаюсь изменить исходный код 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);
Как я могу автоматизировать это?
Вы могли рассмотреть использование 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);
Я принимаю все строки, которые Вы хотите изменить, запускаются со строки 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);