Почему '[a-z] *' соответствует неалфавитным строкам?

Вы должны стремиться запускать less без номеров строк, так как это обычный случай с большими файлами, less -n . Мне также нравится использовать поиск без учёта регистра, поэтому всегда: less -ni везде, где это возможно (например, в busybox'е по умолчанию less не поддерживает эти опции командной строки).

9
20.05.2018, 22:40
2 ответа

Porque *coincide con cero o más repeticiones del átomo anterior, y todos los motores de expresiones regulares intentan encontrar la primera coincidencia. Hay una subcadena de exactamente cero letras al comienzo de su cadena, así que ahí es donde coincide. En el caso de que la cadena comience con una letra, *coincide con tantas como pueda, pero esto es secundario a encontrar la coincidencia más a la izquierda.

Las coincidencias de longitud cero -pueden ser un poco problemáticas y, como viste,la solución es modificar el patrón para que requiera al menos un carácter. Con expresiones regulares extendidas, podría +para eso:sed -E 's/[a-z]+/SUB/'

Por diversión, prueba:

echo 'less than 123 words' | sed 's/[0-9]*/x/g'
12
27.01.2020, 20:04

El patrón [a-z]*coincide con cero o más caracteres en el rango aaz(los caracteres reales dependen de la configuración regional actual ). Hay cero caracteres de este tipo al comienzo de la cadena 123 abc(, es decir, el patrón coincide con ), y también cuatro de ellos al comienzo de this is a line.

Si necesita al menos una coincidencia , use [a-z][a-z]*o [a-z]\{1,\}, o habilite expresiones regulares extendidas con sed -Ey use [a-z]+.

Para visualizar dónde coincide el patrón, agregue paréntesis alrededor de cada coincidencia:

$ sed 's/[a-z]*/(&)/' file
()123 abc
(this) is a line

O, para ver todas las coincidencias en las líneas:

$ sed 's/[a-z]*/(&)/g' file
()1()2()3() (abc)
(this) (is) (a) (line)

Compare ese último resultado con

$ sed -E 's/[a-z]+/(&)/g' file
123 (abc)
(this) (is) (a) (line)
28
27.01.2020, 20:04

Теги

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