У меня есть файл alphanum
с этими двумя строками:
123 abc
this is a line
Я не понимаю, почему, когда я бегу sed 's/[a-z]*/SUB/' alphanum
, я получаю следующий вывод:
SUB123 abc
SUB is a line
Я ожидал:
123 SUB
SUB is a line
Я нашел исправление (используйте sed 's/[a-z][a-z]*/SUB/'
вместо этого), но я не понимаю, почему оно работает, а мое нет.
Вы можете помочь?
sed
regular-expression
Фахер Мокадем
источник
источник
ls foo*
там используется). Но в любом случае, если вы обнаружите дубликаты вопросов, я думаю, вы также сможете пометить их как таковые.Ответы:
Шаблон
[a-z]*
соответствует нулю или нескольким символам в диапазонеa
доz
( фактические символы зависят от текущей локали). В самом начале строки123 abc
(таких как шаблон соответствует) ноль таких символов , а также четыре из них в началеthis is a line
.Если вам нужно хотя бы одно совпадение, используйте
[a-z][a-z]*
или[a-z]\{1,\}
или включите расширенные регулярные выражения с помощьюsed -E
и используйте[a-z]+
.Чтобы визуализировать совпадения шаблона, добавьте скобки вокруг каждого соответствия:
Или, чтобы увидеть все совпадения по строкам:
Сравните этот последний результат с
источник
[a-z]
соответствует элементам сопоставления, которые могут состоять из более чем одного символа. Например, в некоторых венгерских регионах[a-z]
матчиdzs
Потому что
*
совпадает ноль или более повторений предыдущего атома, и все движки регулярных выражений пытаются найти первое совпадение. В начале вашей строки есть подстрока, состоящая из ровно нулевых букв, так что это то, где она совпадает. В случае, когда строка начинается с буквы,*
совпадает столько, сколько может, но это вторично по отношению к нахождению крайнего левого соответствия.Совпадения нулевой длины могут быть немного проблематичными, и, как вы видели, решение состоит в том, чтобы изменить шаблон так, чтобы для него требовался хотя бы один символ. С расширенными регулярными выражениями вы могли бы
+
для этого:sed -E 's/[a-z]+/SUB/'
Для развлечения попробуйте:
источник