предложение regex

ls уже выполняет тот поиск. Можно выполнить поиск информации о пользователе из командной строки с getent passwd.

Если ls показывает идентификатор пользователя вместо имени пользователя, это - потому что нет никакого пользователя тем именем. Файловые системы хранят идентификаторы пользователей, не имена пользователей. Если Вы монтируете файловую систему от другой системы, или если файл принадлежит теперь-удаленному-пользователю, или если Вы передали числовой идентификатор пользователя chown, у Вас может быть файл, который принадлежит идентификатору пользователя, который не имеет имени.

На общем хосте у Вас может быть доступ к некоторым файлам, которые совместно использованы между несколькими виртуальными машинами, каждым с их пользовательской базой данных. Это немного странно (почему совместно используют файлы, но не пользователей, которые владеют ими?), но это технически возможно.

0
26.03.2013, 19:34
3 ответа

Попытайтесь использовать egrep или передача -E флаг к grep:

echo "223255/12345678                    " | egrep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'

или

echo "223255/12345678                    " | grep -E '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
1
28.01.2020, 02:17
  • 1
    Это все еще соответствовало бы на x@, \\ , возможно é и нет - –  Stéphane Chazelas 26.03.2013, 23:17

возможно, выйдите / символ....., что (\) используемый для? Но Походит, так как Вы в одинарных кавычках, Вы не должны выходить из всего, что Вы помещаете там.

Мое предложение для отладки состоит в том, чтобы удалить некоторые символы и видеть что не так с шаблоном.

0
28.01.2020, 02:17

Существует несколько проблем с Вашим кодом:

  • Внутри [...], единственные специальные символы - и ] (хотя существует также [: который представляет классы символов), и способ выйти из них не с \, но для - путем создания этого первым или последним знаком в списке ([-...] или [...-]) и для ] путем создания этого первым ([]...]). Выше, \-\ средства любой символ в диапазоне \ кому: \, это - это, включает \, но нет -. Таким образом, Вам было бы нужно [-0-9a-zA-Z/?:().,"+].
  • Остерегайтесь, который располагается как a-z и A-Z иждивенец локали (как, может включать вещи как é, ŝ...), и может также включать многобайтовые символы. Если Вы только хотите включать символы ASCII в те диапазоны, необходимо прикрепить локаль к C: ... | LC_ALL=C grep ...
  • {x,y} оператор расширенного регулярного выражения (как поддерживается grep -E). Соответствующее основное регулярное выражение (как поддерживается grep) оператор \{x,y\}. Так LC_ALL=C grep '[-0-9a-zA-Z/?:().,"+]\{1,34\}'
  • в grep pattern, grep проверки, если pattern соответствия где угодно в каждой строке входа. Если Вы хотите, чтобы это соответствовало целой строке, Вам нужно -x опция (для точного) или привязка шаблон в запуске и конце с ^ и $ операторы regexp. grep -E 'x{1,34}' совпадает с grep x, потому что строка, которая содержит любую последовательность 1 - 34 x также содержит тот x и строка, которая содержит x содержит последовательность 1 x так соответствует x{1,34} regexp.
  • Принятие Вы делаете echo "$var" | grep the-pattern, остерегайтесь этого, это не надежно, потому что некоторые echo например, повернулся бы -neen в пустую строку, в то время как другие повернулись бы \n в символ новой строки, например. Также отметьте это grep соответствия на каждой строке входа, не на целом входе, таким образом, Ваша проверка не могла бы быть допустимой если $var может содержать символы новой строки. Лучше всего должен был бы использовать expr вместо этого или [[ $var =~ pattern ]] оператор ksh93, zsh или удара.

Таким образом, если Вы хотите проверить это $var сделан из 1 - 34 из тех символов ASCII, необходимо записать это:

if LC_ALL=C expr "x$var" : 'x[-0-9a-zA-Z/?:().,"+]\{1,34\}$' > /dev/null; then
  echo yes
else
  echo no
fi

(expr привязывает шаблон к запуску неявно, как будто был a ^ оператор regexp)

4
28.01.2020, 02:17
  • 1
    Это было, возможно, немного больше, чем OP означал просить, но это - большая ссылка! Я сохраняю это для того, когда я поражаю голову против стола с некоторой странной regex проблемой, я просто не могу выяснить. (Это - позор, каждый не может любимые ответы.) –  a CVn 26.03.2013, 23:36
  • 2
    Спасибо за то, что заняли время в предлагающих решениях для проблем в моем regex. –  would_like_to_be_anon 03.04.2013, 21:10

Теги

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