Проблема с побочным эффектом OpenBSD Unix 6.6 Gnome 3.2 в диспетчере окон

Базовый скрипт

Я использовал 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для получения дополнительной информации об этом формате.

бенчмаркинг версии sed

Как предполагает 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
2
18.01.2020, 01:06
1 ответ

Итак, проблема решена!!! Решение состояло в том, чтобы использовать sysupgrade -s, затем компьютер перезагрузится, обновится и снова перезагрузится, что обновит текущую версию OpenBSD 6.6 -. Затем снова включите gnome с помощью команд rcctl и отключите xenodm с помощью rcctl и перезагрузитесь, затем Гном работает!

Кроме того, очень важно, если вы получаете сообщение об ошибке «ftp 404 not found» при выполнении команды sysupgrade, измените файл /etc/installurl на следующий:

https://cdn.openbsd.org/pub/OpenBSD

1
27.01.2020, 22:16

Теги

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