Para extraer joebloggs
de esta cadena en bash usando la expansión de parámetros sin ningún proceso adicional ...
MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*} # retain the part before the colon
NAME=${NAME##*/} # retain the part after the last slash
echo $NAME
No depende de joebloggs
estar a una profundidad particular en el camino.
Resumen
Una descripción general de algunos modos de expansión de parámetros, como referencia ...
${MYVAR#pattern} # delete shortest match of pattern from the beginning
${MYVAR##pattern} # delete longest match of pattern from the beginning
${MYVAR%pattern} # delete shortest match of pattern from the end
${MYVAR%%pattern} # delete longest match of pattern from the end
Entonces #
significa coincidir desde el principio (piense en una línea de comentario) y %
significa desde el final. Una instancia significa más corta y dos instancias significa más larga.
Puede obtener subcadenas basadas en la posición usando números:
${MYVAR:3} # Remove the first three chars (leaving 4..end)
${MYVAR::3} # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)
También puede reemplazar cadenas o patrones particulares usando:
${MYVAR/search/replace}
Tiene pattern
el mismo formato que la coincidencia de nombre de archivo, por lo que *
(cualquier carácter) es común, a menudo seguido de un símbolo particular como /
o.
Ejemplos:
Dada una variable como
MYVAR="users/joebloggs/domain.com"
Elimine la ruta dejando el nombre del archivo (todos los caracteres hasta una barra):
echo ${MYVAR##*/}
domain.com
Elimine el nombre del archivo, dejando la ruta (elimine la coincidencia más corta después de la última /
):
echo ${MYVAR%/*}
users/joebloggs
Obtenga solo la extensión del archivo (elimine todo antes del último período):
echo ${MYVAR##*.}
com
NOTA: Para hacer dos operaciones, no puede combinarlas, pero debe asignarlas a una variable intermedia. Entonces, para obtener el nombre del archivo sin ruta o extensión:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
lugar de%
. Si solo desea la parte después de los últimos dos puntos, use${MYVAR##*:}
para obtener la parte después de los primeros dos puntos, use${MYVAR#*:}
${RET##*$CHOP}
o así${RET##*CHOP}
(o de otra manera)? EDITAR: Parece ser el primero,${RET##*$CHOP}
Defina una función como esta:
Y pasa la cadena como parámetro:
fuente
echo $1 | cut -d -f 1 | xargs
. +1 para ans simples y ordenadas.¿Y sed? Eso funcionará en un solo comando:
#
están utilizando para divisores de expresiones regulares en lugar de/
porque la cadena tiene/
..*/
agarra la cadena hasta la última barra invertida.\( .. \)
marca un grupo de captura. Esto es\([^:]*\)
.[^:]
dice cualquier carácter _except dos puntos y los*
medios cero o más..*
significa el resto de la línea.\1
significa sustituir lo que se encontró en el primer (y único) grupo de captura. Este es el nombre.Aquí está el desglose que hace coincidir la cadena con la expresión regular:
fuente
Usando un solo sed
fuente
Usando un solo Awk:
Es decir, usando como separador de campo
/
o:
, el nombre de usuario siempre está en el campo 5.Para almacenarlo en una variable:
Una implementación más flexible
sed
que no requiere que el nombre de usuario sea el campo 5:Es decir, elimine todo desde
:
y más allá, y luego elimine todo hasta el último/
.sed
probablemente también sea más rápido queawk
, por lo que esta alternativa es definitivamente mejor.fuente