RegExp: пытаюсь понять это. Выполняя запрос

Ваш диспетчер пакетов теперь является несуществующим PerlScript. Цитирую:

Что, ты боишься запускать? Не волнуйся. Это безвредно. Фактически, больше ничего не делает. Раньше он что-то делал (5 баллов, если вы можете мне сказать, что именно), но затем началась битва. В этой истории есть мораль (10 баллов).

Взято из: ToastBall.net

Обратите внимание, что я не вводил здесь систему баллов, но, по сути, отвечаю на вопрос из 5 баллов.


Я полагаю, что битрот, о котором говорит автор, - это бит в freshmeat (цитата):

  • Сайт Freecode был переведен в статическое состояние с 18 июня 2014 года из-за низкого уровня трафика, чтобы люди могли сосредоточиться на более полезных начинаниях, чем содержание сайта.
  • Содержимое сайта было сохранено в этом статическом состоянии как постоянный путь для доступа к связанному программному обеспечению, большая часть которого находится на
    собственных серверах, и их было бы трудно найти в противном случае.

См. Полную запись в О Freecode


Reasoning

Обратите внимание на последний официальный пакет для загрузки с официального сайта разработчика, версия 1.486 от 15 июля 2012 г. и параметр, содержащийся на странице руководства :

- findites = SITELIST

Задайте список веб-сайтов или других местоположений, которые будут искать с помощью функции toast find для пакетов, которые еще не были добавлены. SITELIST - это список URL-адресов и / или специальных слов, разделенных пробелами, взятых из следующего списка: freshmeat, googlecode, sourceforge, gnu, cpan или все (что означает для всех предыдущих слов в указанном порядке). Символ * будет заменен именем пакета, чтобы найти его, где бы он ни встречался. Если вам нужен буквальный символ *, тоже плохо. По умолчанию: все.

Обратите внимание, что список по умолчанию содержит freshmeat и gnu. При нормальных обстоятельствах gnu shoud никогда не исчезнет, ​​поскольку все Linux являются производными от GNU Software, а GNU Software Foundation является юридическим лицом. Freshmeat, с другой стороны, был хостинг-сайтом для проектов, большинство из которых сейчас размещены на SourceForge или GitHub. Разработчик, с другой стороны, жестко запрограммировал этот список где-то в своем Perl-скрипте, и, поскольку он решил не обновлять список новыми сайтами, когда старые перестают функционировать, скрипт перестает работать.


Возможные решения

  1. Самое близкое, что вы получите, - это указать gnu как единственный параметр в параметре --findsites, т. Е. - findites = gnu , но учтите, что вы не можете добавлять репозитории для конкретных дистрибутивов, потому что скрипт perl распознает только элементы, доступные в SITELIST множество.
  2. Покопавшись, я нашел массив SITELIST: (Строки 2380–2388 скрипта configure / Toast): my (@sites) = ( "freshmeat" => " http://freshmeat.net/projects/ $ lcname", "googlecode" => " http: // code.google.com/p/$lcname/downloads/list", "sourceforge "=>" http://www.mirrorservice.org/sites/ ". "download.sourceforge.net/pub/sourceforge/$sfname/", "gnu" => " http://ftp.gnu.org/gnu/ $ lcname / ", " cpan "=>" http://cpan.uwinnipeg.ca/module/ $ perlname ", );

Вы можете удалить freshmeat из этого массива, но тогда вам нужно обновить обработчик (строки 2400-2494), удалить поиск freshmeat и добавить синтаксический анализ поиска для каждого типа репозитория, который вы хотите добавить ... Этот подход ПЛОХО , поскольку нельзя гарантировать статичность URL-адреса, но этот массив представляет собой набор статических строк.


Вопрос из 5 баллов : Он использовался для установки пакетов. Вопрос из 10 баллов (догадка): Теперь, когда установлен битрот, и я понимаю, что URL-адреса могут изменять структуру или Умереть, мораль такова: программист не должен полагаться на поиск строки, если он не может отвечать за способ форматирования строки.

0
20.04.2019, 18:08
2 ответа

Una variable es una cadena que consta de un carácter [a-zA-Z_]seguido de cero o varios [a-zA-Z_0-9]caracteres (en la configuración regional POSIX/C ).

Podemos hacer coincidir estas cadenas que están seguidas directamente por un =y eliminar el resto de la línea:

sed 's/\([a-zA-Z_][a-zA-Z_0-9]*=\).*/\1/' file

En su archivo de ejemplo, esto producirá

NameOfServer=
`#`==========
`#` UserData
`#`==========
1
28.01.2020, 02:31

={1}.*es lo mismo que =.*y coincidirá con un signo igual, seguido de cualquier cantidad de caracteres. Las expresiones regulares suelen ser "codiciosos", por lo que intentan encontrar la coincidencia más larga. El uso de ese patrón contra una cadena de signos iguales coincidirá con toda la cadena, ya que no hay forma de que el motor de expresiones regulares sepa que se refiere a caracteres que no sean signos iguales.

Utilice =[^=]*para hacer coincidir un signo igual seguido de cualquier cantidad de caracteres que no sean signos iguales. O =[^=].*para coincidir con un signo igual, seguido de cualquier otro carácter, seguido de cualquier cosa.

O, para unir líneas con asignaciones de variables más de cerca, algo como

sed -Ee 's/^([a-zA-Z0-9_]+=).*/\1/'

verificaría que la línea se vea como una asignación de variable, y luego eliminaría cualquier cosa después de =. Eso supone que los nombres de las variables solo pueden contener letras, números y guiones bajos en inglés. Es posible que deba ajustar eso.

1
28.01.2020, 02:31

Теги

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