awk: error: tent of \ {\}

У меня есть рабочая установка с некоторыми контейнерами squashfs, особенно в целях безопасности

Для запуска просто добавьте

lxc.rootfs = loop:/var/lib/lxc/yourcontainer/rootfs.squashfs

в ваш конфигурационный файл.

Интересно, что я вижу сообщения dmesg вроде

[218687.113742] EXT4-fs (loop0): VFS: Can't find ext4 filesystem
[218687.118615] FAT-fs (loop0): invalid media value (0x00)
[218687.120368] FAT-fs (loop0): Can't find a valid FAT filesystem

... которых я не могу избежать, потому что нет опции lxc.rootfs.type. Но эти сообщения не являются ошибками - все работает, как ожидалось.

Остальное - обычные проблемы с read-only-root: Файлы, в которые система хочет писать (например, resolv.conf и журналы). Возможно, вы захотите связать их симлинком с томом tmpfs.

Я не пробовал монтировать другой squashfs в подпункт этого контейнера, но обычное связывающее монтирование каталога хоста работает как ожидалось.

3
06.06.2018, 13:31
3 ответа

Versión corta, usa esto:

$ echo "name@server.com" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'

Asumiendo que el mensaje de error real es algo como:

awk: cmd. line:1: error: Invalid range end: …

Entonces, hay 4 problemas en su línea:

  1. El guión(-)significa "rango de caracteres", no un guión explícito.

    El motivo del mensaje de error es que los dos caracteres que rodean el guión(-)dentro del rango de caracteres(_y.)no están en orden (ASCII ). El rango de caracteres .-_no genera ningún error. Pero estoy seguro de que no quiere decir "rango de caracteres" (todos los caracteres entre un punto .y un guión bajo _), sino hacer coincidir un guión explícito(-).

    Para hacer coincidir un guión explícito dentro de una "expresión de paréntesis", debe convertirlo en el primer o último carácter del rango. Ya sea [-…], […-]. O, desalentado, escapar de ella \-. Es decir, ambos funcionan:

    [-a-zA-Z0-9_.+]
     [a-zA-Z0-9_.+-]
    

    Pero no, una barra invertida no es una solución general para hacer explícito un guión. Prueba:

    $ echo 'ab-cd' | grep -Eo '[a\-c]+'
    ab
    c
    

    La expresión regular grep (incluso si se extiende:-E)no coincide con el guión.

  2. El +no es especial dentro de una "expresión entre corchetes", por lo tanto, no necesita escape (y escapar dentro de "expresiones entre corchetes" es un mal hábito ). Usa esto:

    ^([-a-zA-Z0-9_.+]+)@
    
  3. Un punto .es un carácter especial que "coincide con cualquier carácter excepto el de nueva línea".
    Como tal, debe escapar \.o usar una "expresión de paréntesis" [.]para hacer coincidir explícitamente un carácter de punto, use esto:

    ^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
    
  4. Y, finalmente, la "expresión de intervalo" es una extensión sobre las implementaciones históricas de awk, es posible que no funcione en todos los awk. Esto generalmente "no es un problema", pero si lo es, deberá usar:

    ([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$
    

Pero probablemente esté usando GNU awk,y la sintaxis correcta debería ser:

$ echo "name@server.com" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'
2
27.01.2020, 21:15

¿Qué versión de awkestás usando?

Este comando no da error cuando uso GNU awk, aunque no produce ningún resultado.

Usandosolarisawkproduce este error:

awk: syntax error near line 1
awk: bailing out near line 1

Leyendo su regex, nunca va a coincidir con una dirección de correo electrónico...

0
27.01.2020, 21:15

Respuesta:

echo "name@server.com" | awk '/^([-a-zA-Z0-9_.\+]+)@([-a-zA-Z0-9_.]+).([a-zA-Z]{2,5})$/ {print $0}'
name@server.com

Explicación:El carácter -es ambiguo en la posición donde lo pones, ya que podría representar un intervalo. Moverlo al comienzo de la expresión regular, o escaparlo, funciona bien.

Más información:Verifique sus expresiones regulares en este útil sitio web en caso de duda.


Como señaló correctamente Isaac , el último punto en la expresión no hace lo que probablemente piensas que hace:.representa cualquier carácter, y debes escapar si quieres que signifique un punto literal\.

Otras optimizaciones incluyen no escapar caracteres dentro de corchetes ya que no es necesario. ¡Estoy señalando \+en el primer conjunto de caracteres, y tengo que agradecer a Isaac nuevamente por detectar esto!

Una cosa más que me supera es por qué usarías todos esos corchetes redondos ().

Además de corregir el uso de -y sugerir algunas mejoras menores, el tema subyacente aquí es la oportunidad ampliamente discutida de emplear expresiones regulares para validar direcciones de correo electrónico. Hacer coincidir correctamente cualquier dirección de correo electrónico es una tarea difícil que requiere una expresión mucho más compleja de lo que uno podría imaginar inicialmente. Una opción razonable, que a menudo se encuentra en este y otros foros similares, es usar la expresión regular más simple que se espera que funcione con su conjunto de datos.

2
27.01.2020, 21:15

Теги

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