Я использовал perl, потому что с ним проще сопоставлять несколько строк (в отличие, скажем, от sed ). Базовый сценарий выглядит следующим образом.
perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input
perl -0777 -pe
:вызвать perl, используя -0777
, чтобы проглотить весь файл, т. е. разрешить многострочную обработку -. 's/foo/bar/gm'
:заменить foo
на bar
, даже если совпадений несколько(g
); это многострочное выражение(m
). ^Log\.d\(.*?(\n.*?)*?\);\n
:искать строки, начинающиеся с Log.d(
; это выражение необходимо экранировать(^Log\.d\(
). После этого может быть больше символов (.*?
), возможно, новая строка с большим количеством символов((\n.*?)
)и, возможно, несколько итераций этого последнего выражения (*?
). После этого найдите закрывающий );
, за которым следует новая строка (, экранированная как\);\n
). Все эти подстановочные знаки не -жадные(*?
не*
). Следовательно, они будут пытаться сопоставить минимально возможное количество символов вместо удаления от первого ^Log\.d\(
до последнего \);\n
всего файла. input.txt
:
Keep me A
Log.d("I can be easily deleted", "");
Keep me B
Keep me C
Log.d("I span a new line, "hel"
+ "lo");
Keep me D
Запустить скрипт:
$ perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input.txt
Keep me A
Keep me B
Keep me C
Keep me D
После тестирования сценария, описанного выше, примените его к нескольким файлам. Используйте параметр Perl «на месте -»(-i
)для изменения исходных файлов. Сначала сделайте резервную копию каталога. Если все файлы находятся непосредственно в одном каталоге,вы можете просто отправить несколько аргументов сценарию, используя подстановочные знаки оболочки.
perl -i -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' *.java
Однако, учитывая, что у вас могут быть вложенные каталоги (и я не знаю, какую оболочку вы используете ), вы можете использовать здесь find
.
find /path/to/dir -name '*.java' -execdir perl -i -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' {} \;
find /path/to/dir
:смотри в /path/to/dir
. -name '*.java'
:найти только файлы, соответствующие этому выражению. -execdir perl -i -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' {} \;
:запустите приведенный выше скрипт в -поместите(-i
)в соответствующий файл {}
. См. man find
для получения дополнительной информации об этом формате.
Как предполагает don _crissti в комментариях , существует команда sed, которая также может это сделать.
sed -e '/Log/{' -e ': do' -e '/);/d;N' -e 'b do' -e '}' input.txt
Я протестировал обе команды, используя в качестве входных данных следующий файл.
Keep me A
Log.d("I can be easily deleted", "");
Keep me B
Keep me C
Log.d("I span a new line, "hel"
+ "lo");
Keep me D
Log.d("I span a new line, "hel"
+ "lo" +
+ "there");
Keep me E
Я провел сравнительный анализ команд. Версия perl
немного быстрее для этого файла в моей системе.
$ time (for i in {1..1000}; do perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input.txt > /dev/null; done)
================
CPU 101%
user 1.484
system 3.372
total 4.793
$ time (for i in {1..1000}; do sed -e '/Log/{' -e ': do' -e '/);/d;N' -e 'b do' -e '}' input.txt > /dev/null; done)
================
CPU 101%
user 2.647
system 2.847
total 5.429
Я также создал еще один тестовый файл, содержащий 1000 повторов файла input.txt
выше. В этом случае версия sed была быстрее.
$ time (for i in {1..100}; do perl -0777 -pe 's/^Log\.d\(.*?(\n.*?)*?\);\n//gm' input1000 > /dev/null; done)
================
CPU 100%
user 1.132
system 0.409
total 1.535
$ time (for i in {1..100}; do sed -e '/Log/{' -e ': do' -e '/);/d;N' -e 'b do' -e '}' input1000 > /dev/null; done)
================
CPU 100%
user 0.560
system 0.298
total 0.853
Итак, проблема решена!!! Решение состояло в том, чтобы использовать sysupgrade -s, затем компьютер перезагрузится, обновится и снова перезагрузится, что обновит текущую версию OpenBSD 6.6 -. Затем снова включите gnome с помощью команд rcctl и отключите xenodm с помощью rcctl и перезагрузитесь, затем Гном работает!
Кроме того, очень важно, если вы получаете сообщение об ошибке «ftp 404 not found» при выполнении команды sysupgrade, измените файл /etc/installurl на следующий: