использование простого regex выражения квантора в grep

Вы уверенный, что это не высказывание Mac, "Посмотрите, у нас есть рабочий стол как GNOME!".

openSUSE хорош и прибывает в несколько ароматов как KDE (окна как с несколькими дополнениями), гном (как Mac...), и lxde/xfce (легкие дистрибутивы).

Это использует основанную на об/мин систему управления пакета с застежкой-молнией (libzypp).

YaST является также потрясающим в openSUSE. Это делает управление системой очень удобным для пользователя.

Если Вам не нравится то, что Вы видите, создаете свое собственное с suseStudio!

Не уверенный, если они похожи 'на предыдущую человечность' версии. Но мир с открытым исходным кодом всегда совершенствуется/изменяет, и не повреждает адаптировать и изучать новые вещи.

1
25.07.2013, 00:49
4 ответа

Я думаю причина, Вы ожидаете что-то другое, чем, что происходит, то, что Вы берете

[0-9]{n}

означать соответствие только точно n случаи символов в [0-9] и выбрасывать остальных, когда, что его выполнение находит n случаями символов в [0-9] и называет это соответствием. Таким образом в

[0-9]{1}

это находит любого точно одним возникновением чего-то соответствующего [0-9] так 1 соответствие, затем при исследовании этих 22, это останавливается в первых 2 и считает это соответствием, не смотря на остальных. Так же для 333. Если Вы указали

[0-9]{2}

это не соответствовало бы 1, но 22 соответствия и затем 33 в 333 соответствиях, таким образом, это захватывает его.

Как slm сказал, границы слова являются билетом здесь. У Вас есть и-P и-E разновидности grep regex соответствие в Вашем вопросе. Можно использовать GNU \<и \> с-E как это:

ls | xargs -n 1 basename | grep -E '\<[0-9]{1}\>'

или \b с или-E или соответствие pcre-P как это

ls | xargs -n 1 basename | grep -P '\b[0-9]{1}\b'
4
27.01.2020, 23:12

Использовать grep -x найти точные совпадения вместо того, чтобы найти соответствия в строках.

grep foo находит строки, которые содержат foo, в то время как grep -x foo находит строку, которые являются foo.

То же самое, grep -E '[0-9]{1}' (то же как grep '[0-9]') находит строки, которые содержат одну цифру. grep -xE '[0-9]{1}' находит строки, которые состоят из одной цифры.

С GNU grep, можно использовать --color или -o опции видеть, что подбирается, хотя это покажет Вам все соответствия.

3
27.01.2020, 23:12

Это вызвано тем, что первые два символа 333 соответствуйте regex, таким образом, целая строка соответствует.

Если Вы хотите избежать, чтобы Вы могли использовать:

(^|[^0-9])[0-9]{2}([^0-9]|$)
1
27.01.2020, 23:12

При помещении содержания примеров в текстовом файле, Вы видите почему grep соответствует ему:

$ grep -E '[0-9]{1}' file.txt
touch 1
touch 22
touch 333

Можно использовать границы слова (-w) сказать grep то, что Вы хотите только распознать отдельное слово своего regex (\<REGEX\>) вместо любой строки, которая, оказывается, соответствует ему:

$ grep -Ew '\<[0-9]{1}\>' file.txt
touch 1

$ grep -Ew '\<[0-9]{2}\>' file.txt
touch 22

$ grep -Ew '\<[0-9]{3}\>' file.txt
touch 333

\< и \> сказать grep где границы. Это вызывает grep для распознавания явных слов такой как 1, но не строки такой как 11, 111, или aa11aa, начиная с, regex в этих строках не содержится границами слова.

0
27.01.2020, 23:12

Теги

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