Regex & Sed/Perl: Распознайте слово, которому не предшествует другое слово

Короче говоря, consolekit является сервисом, который отслеживает сеансы пользователя (т.е. где пользователь зарегистрирован). Это позволяет переключать пользователей, не выходя из системы (многие, пользователь может быть зарегистрирован на тех же аппаратных средствах одновременно с одним активным пользователем). Это также используется, чтобы проверить, "локальна" ли сессия т.е. если у пользователя есть прямой доступ к аппаратным средствам (который можно считать более безопасным затем удаленный доступ). Документация ConsoleKit.

PolicyKit позволяет подстроенные возможности в настольной среде. Традиционно только привилегированному пользователю (корень) разрешили настроить сеть. Однако, в то время как в серверной среде это - разумное предположение, что это также ограничило бы, чтобы не быть позволенным соединиться с горячей точкой на ноутбуке, например. Однако Вы все еще не можете хотеть давать полные полномочия этому человеку (как установка программ) или можете хотеть ограничить опции для некоторых людей (например, на Ваших дочерних ноутбуках, только 'доверил' сетям родительские фильтры, может использоваться). Насколько я помню, что это работает как:

  • Программа отправляет сообщение демону через dbus о действии
  • Демон использует библиотеки/конфигурацию PolicyKit (на самом деле демон PolicyKit), чтобы определить, разрешают ли пользователю выполнить действие. Это может произойти, что определенные условия должны быть выполнены (как ввод пароля или аппаратного доступа).
  • Демон выполняет, действие согласно ему (возвращает подлинную ошибку или выполняет действие),

Документация PolicyKit.

РЕДАКТИРОВАНИЕ в настоящее время ConsoleKit в основном заменяется вошедшим, который является частью systemd, хотя существует автономная версия elogind.

11
06.11.2011, 17:35
3 ответа

Было бы легко с любым языком, где регулярные выражения способны к lookbehind. Конечно, Perl является первым в списке:

perl -pe 's/(?<!John\W)Smith/John/g' <<< "John Smith and Jane Johnson talk about Smith's car."

Слабое место имеет больше чем один несловесный символ между “John” и “Smith”. К сожалению, квантор как + для \W повысил бы “Переменную длину lookbehind не реализованная” ошибка.

8
27.01.2020, 19:58

РЕДАКТИРОВАНИЕ.. ре Ваш комментарий.. Вот новый сценарий, который не интересуется о (например). William Smith. Это временно запутывает шаблоны, которые это сохраняет как Smith (неизменным).

sed -r 's/\<(John) (Smith)\>/\1\x01x\2/g; 
        s/\<Smith\>/John/g;  s/\x01x/ /g'

Если Вы обеспокоены г-ном г-на г-жу... затем это работает.

sed -r 's/\<(John|((M(r|rs|s))\.?)) (Smith)\>/\1\x01x\5/g
        s/\<Smith\>/John/g; s/\x01x/ /g'

Можно обслужить William путем добавления его имени к или список, например.
sed -r 's/\<(William|John|...


Это - orginal сценарий

sed -r 's/(^|[[:punct:]] |\<[a-z]+ )(Smith\>)/\1John/'
6
27.01.2020, 19:58
  • 1
    Это работает, но одна проблема, которую я нашел, состояла в том, что, если слово, прежде чем Smith использован для своей выгоды (например, оно прибывает после первого слова в предложение) затем оно не соответствует. Решение для жемчуга manatwork не имеет той проблемы, даже если это перестало бы работать в других ситуациях. К счастью, мой текстовый файл не имеет заголовков как г-н или люди с той же фамилией. А-ч –  jonescb 06.11.2011, 18:32
  • 2
    Да спасибо... Я отправил исправленный сценарий... –  Peter.O 06.11.2011, 22:52
 sed -r 's/([^John] )Smith/\1John/g;s/([^Jane] )Johnson/\1Jane/g'

() получит non-Firstname перед LastName, таким образом, они - backref'd в замене.

Править

@manatwork, gilles

Вы правы. Как насчет

sed -r 's/(John Smith)/temp1/g;s/Smith/John/g;s/temp1/John Smith/g'

Это, кажется, добивается цели.

1
27.01.2020, 19:58
  • 1
    Это перестанет работать, если не будет никакого другого слова перед именем, например, “Smith и разговор Jane Johnson об автомобиле Smith's”. –  manatwork 06.11.2011, 17:24
  • 2
    [^John] соответствия один символ, который должен быть одним из J, o, h или n. Я сомневаюсь, что это - то, что Вы предназначили. Нет никакой конструкции отрицания в регулярных выражениях (Perl имеет (?!…) и (?<!…), но если Вы будете думать о нем как об отрицании, то это, вероятно, не сделает то, что Вы ожидаете). –  Gilles 'SO- stop being evil' 06.11.2011, 18:54
  • 3
    @Juaco: Ваше взятие 2 работы, но восприимчиво к неожиданным данным. Я использовал похожий метод (хотя немного неохотно) потому что использование sed без него делает для чрезмерно увеличенной в размерах sed логики... temp1 будет почти всегда прекрасен, но! не упустите ту шину. Для смягчения этой возможности я полагаю, что лучше использовать символы, которые (почти) никогда не происходят в текстовых файлах Латинского Сценария, например, Шестнадцатеричном \x01 \x02 значения, или комбинациях их или возможно локали \xe188b4 UTF-8 (ሴ - ЭФИОПСКИЙ СЛОГ ВИДИТ).. например. echo -e 'Z' |sed 's/./\xe1\x88\xb4/' => когда локаль является UTF-8.. –  Peter.O 07.11.2011, 05:00

Теги

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