Как заменить строку, которая НЕ соответствует IP-адресу, фиктивным IP-адресом?

Я обнаружил, что ситуация связана как с удаленным драйвером, так и с тем, что текущая видеокарта изначально не поддерживает OpenGL. -Hiri отображает OpenGL? логотип при запуске.

Затем я попытался восстановить удаленные пакеты, включая libgl1-mesa-dri, но ошибка не сильно изменилась.

apt-get install libgl1-mesa-dri

Пришлось установить следующий пакет:

apt-get install libegl1-mesa-drivers

После установки приложение уже загружалось и показывало главный экран (главный экран почтового клиента ).

Однако теперь приложение во время загрузки вылетает при первом щелчке мыши и/или при открытии электронного письма со следующими ошибками:

libEGL warning: DRI2: failed to authenticate
libEGL warning: DRI2: failed to authenticate
[2106:2220:0815/191858.546603:ERROR:gl_implementation.cc(225)] Failed to load libGLESv2.so.2: libGLESv2.so.2: cannot open shared object file: No such file or directory
[2106:2220:0815/191858.885012:ERROR:gl_surface_qt.cpp(667)] Requested OpenGL implementation is not supported. Implementation: 0
./hiri.sh: line 13:  2105 Segmentation fault      "$SCRIPTDIR/hirimain" $@

Погуглив, я обнаружил, что эти ошибки могут быть связаны с отсутствием libgles2-mesaбиблиотеки. Странно, что его не было до (, например. это не был один из удаленных пакетов ). Затем я установил его с:

apt-get install libgles2-mesa

После установки этой последней библиотеки/пакетаприложение позволило мне использовать его.

Также удаление update-glxи glx-diversionsи glx-alternative-mesaокончательно избавили от сообщения libEGL warning: DRI2: failed to authenticate.

ПС. Я просто получаю несколько последних прикладных ошибок Python при закрытии приложения , сообщил о них Хири.

3
27.06.2021, 15:02
4 ответа

ПРИМЕЧАНИЕ. :другие указали, что выбранное вами регулярное выражение для IPv4-адреса некорректно. Я не буду пытаться говорить об этом здесь, так как это хорошо описано в другом месте.

Вы можете использовать команду sed c hange для строк, которые(!)не соответствуют вашему RE, например.

$ sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c\
192.168.0.0
' file.txt
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50

С помощью GNU sed вы можете упростить до

sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c192.168.0.0' file.txt
6
28.07.2021, 11:22
sed '/^\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}$/!s/.*/192.168.0.0/' data

Если строка не является действительным адресом IPv4, замените текущую строку на:192.168.0.0.

Я советую вам использовать другое значение для фиктивного адреса вместо 192.168.0.0, но это зависит от вас и ваших потребностей.

Или то же, но сawk:

awk '!/^([0-9]{1,3}\.){3}[0-9]{1,3}$/ {$0="192.168.0.0"}1' data

илиperl:

perl -MNet::IP -ple '$_ = "192.168.0.0" unless new Net::IP($_)' data
5
28.07.2021, 11:22

Ваше регулярное выражение будет соответствовать вещам, которые не являются IPv4-адресами с точками -quad-адресами, но похожи на них (, например.256.256.256.256-очень похоже на адрес IPv4, но не ).

Чтобы соответствовать только действительным IPv4-адресам, необходимо использовать регулярное выражение, например:

(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

или (без модификаторов perlish ?:non -захват группы):

((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

, и это должно быть правильно закреплено, т.е. с ^и $, \bна обоих концах или \<и \>.

См.:Поваренная книга по регулярным выражениям Яна Гойвертса и Стивена Левитана, опубликованная O'Reilly Media, Inc.

напр.

$ sed -E '/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/!s/.*/192.168.0.0/' file.txt 
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
$ perl -p -e 's/.*/192.168.0.0/ unless m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/' file.txt 
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50

Оба они заменяют всю строку ввода на 192.168.0.0, если только строка не соответствует действительному адресу IPv4.

Лично я бы использовал Perl-модуль Regexp ::Common , который представляет собой большой набор регулярных выражений для общих задач сопоставления шаблонов -, удобно доступных в хэше с именем %RE.

$ perl -MRegexp::Common -p -e 's/.*/192.168.0.0/ unless m/^$RE{net}{IPv4}$/' file.txt 
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
7
28.07.2021, 11:22

СPerl:

  • определяют регулярное выражение октета, состоящего из одной-трех цифр, с ограничением, что оно должно быть ненулевым в начале, если только это не одна цифра.
  • соответствуют тому, что строка содержит ровно 4 октета, разделенных точками.
  • разбить строку на точки и что все кортежи меньше 256.
dummy=192.168.0.0 \
perl -MList::Util=all -lpe '
  $octet //= qr/(?!0\d)\d{1,3}/;

  /^$octet(?:[.]$octet){3}$/ &&
   all { $_<256 } split /[.]/ or
     $_ = $ENV{dummy};
' file
1
28.07.2021, 11:22

Теги

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