Для правильного вопроса надо знать половину ответа
ЕМНИП, в basic и extended режимах внутри квадратных скобок символы не эскейпятся и бэкслэш рассматривается как обычный символ. В первом случае получаем интервал от бэкслэша до бэкслэша (то есть, бэкслэш) и точку. Во втором - бэкслэш (дважды), точку и тире.
Эскейпятся только в PCRE (ключ -P).
1. Выясняем, какой у нас движок. POSIX ERE
2. Идём в спецификацию
3. Читаем: When the bracket expression appears within an ERE, the special characters '.', '(', '*', '+', '?', '{', '|', '$', '[', and '\\' shall lose their special meaning within the bracket expression;
То есть \-\ читается "от \ до \" и вместо дефиса мы ищем слеш.
Вывод: Все эти палочки не нужны, достаточно написать echo Test.1-2_3 | grep -E -e ^[A-Za-z0-9_.-]+$
Хм. Теперь понятно, что получилось ровно наоборот от того, что задумывалось :) Но получается, что если мне нужно включить в интервал тире - его ставить строго последним, чтобы оно не воспринималось как разделитель интервала?
В первом случае, насколько я понял, оно воспринимает последние символы как range между подчёркиванием и точкой. Если тире поставить в конце - то его можно не экранировать.
Если тире поставить в конце - то его можно не экранировать.
Возможно это не совсем точное утверждение. Есть вероятность, что экранирование дефиса вообще не работает, если он стоит не в той позиции, где должен работать не как "диапазон". А когда стоит в нужной, то экранировать и так не требуется
Гугл отвечает:
Обзор от ИИ
Within a regular expression character class [], the hyphen - has a special meaning when it is placed between two other characters, where it denotes a range of characters (e.g., [a-z] matches any lowercase letter from 'a' to 'z').
However, if the hyphen is positioned as the very first or very last character within the square brackets, it loses its special "range" meaning and is treated as a literal hyphen character.