KNIME: Сравнить, если один столбец содержит подмножество другого столбца.

Я вижу две потенциальные проблемы с тем, как вы читаете и используете пароль:

  • Когда вы используете команду read без , параметр -r , он попытается интерпретировать последовательности escape (обратная косая черта), что может вызвать проблемы.
  • Когда вы используете переменную без , обертывая ее в двойные кавычки, она попытается разделить значение на отдельные слова, а также попытаться развернуть любые подстановочные знаки в список совпадающих имен файлов. Это может привести к путанице массивного , поэтому вы почти всегда должны ссылаться на ссылки с двойными кавычками.

Исправление этих потенциальных проблем дает этот фрагмент сценария:

read -rs -p "Password : " bindDNPass
ldapadd -H ldap://localhost -x -w "$bindDNPass" -D "dn=cn=Admin" -f /tmp/file.ldif

... Но, хотя вы должны сделать оба этих мода, чтобы сделать ваш скрипт более надежным, ни один из них не изменит, как он обрабатывает пароль $Something18$. Фактически, когда я попробовал свой оригинальный фрагмент с этим паролем, он был правильно принят ldapadd. Если у вашего фактического пароля есть другие специальные символы (или вы играли со значением IFS), это может помочь; в противном случае происходит что-то еще.

Если ваш пароль по-прежнему не работает после этих исправлений, попробуйте поместить set -x перед командой ldapaddset +x после), чтобы он печатал что на самом деле передается ldapadd. Ну, он напечатает его в возможной запутанной форме: он выведет эквивалентную команду на то, что на самом деле выполняется, что означает, что при необходимости он добавит кавычки и / или экраны в параметр пароля так что вы можете запустить эту команду, и она сделает то же самое. Когда я попробовал это с помощью $Something18$, он напечатал:

+ ldapadd -H ldap://localhost -x -w '$Something18$' -D dn=cn=Admin -f /tmp/file.ldif

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

+ ldapadd -H ldap://localhost -x -w \$Something18\$ -D dn=cn=Admin -f /tmp/file.ldif
+ ldapadd -H ldap://localhost -x -w "\$Something18\$" -D dn=cn=Admin -f /tmp/file.ldif
+ ldapadd -H ldap://localhost -x -w $'$Something18$' -D dn=cn=Admin -f /tmp/file.ldif

, поэтому вам нужно взять то, что он печатает, и выяснить, как это будет обрабатываться bash, чтобы выяснить, что на самом деле передается ldapadd. Но, по крайней мере, это даст вам некоторую информацию о том, что на самом деле происходит.

О, и вы можете заметить, что аргумент DN не дублируется. Это потому, что в нем нет каких-либо специальных символов, поэтому двойные кавычки ничего не делают, поэтому они просто оставили их.

0
задан Gábor Bakos 30 March 2019 в 16:30
поделиться

2 ответа

Здесь может помочь узел String Manipulation с regexMatcher, хотя результатом будет String (со значениями True / False по умолчанию), поэтому потребуется дополнительный узел, если для Например, требуется число (если другая строка, вы можете использовать троичный оператор ? / :, например == "True" ? "when true" : join("when false it was because '", $columnReference$, "' was not found")).

Вы можете использовать regexMatcher следующим образом ( \Q / \E помогает избежать обработки содержимого столбца Reference как регулярного выражения (кроме случаев, когда оно содержит \E)) :

regexMatcher($text$, join(".*?\\Q", $Reference$, "\\E.*+")) == "True" ? "vrai" : "faux"

regexMatcher($text$, join(".*?\Q", $Reference$, "\E.*+"))

0
ответ дан Gábor Bakos 30 March 2019 в 16:30
поделиться

Механизм правил допускает использование групповых символов с оператором LIKE, но не позволяет использовать групповые символы в сочетании со столбцами, что означает, что следующее будет работать нормально:

$column1$ LIKE "*test*" => "1"

Следующее также разрешено, но не будет работать нормально:

$column1$ LIKE "*$column2$*" => "1"

Причина в том, что когда вы получили двойные кавычки, $ не распознается, поэтому вы не получаете значения из column2. Вместо этого вы каждый раз получаете одну и ту же строку: "*$column2$*", а это не то, что вам нужно.

Кроме того, вы можете использовать функцию indexOf() в узле String Manipulation или Column Expressions, которая будет возвращать первую позицию строкового значения из column1 в column2. Если не найдено, функция вернет -1. Затем добавьте узел Rule Engine, чтобы добавить соответствующее указание.

0
ответ дан ipazin 30 March 2019 в 16:30
поделиться
Другие вопросы по тегам:

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