Para extrair joebloggs
desta string em bash usando a expansão de parâmetro sem nenhum processo extra ...
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
Não depende de joebloggs
estar em uma determinada profundidade no caminho.
Resumo
Uma visão geral de alguns modos de expansão de parâmetro, para referência ...
${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
Portanto, #
significa combinar desde o início (pense em uma linha de comentário) e %
significa partir do final. Uma instância significa o mais curto e duas instâncias significa o mais longo.
Você pode obter substrings com base na posição 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)
Você também pode substituir strings ou padrões específicos usando:
${MYVAR/search/replace}
O pattern
está no mesmo formato da correspondência de nome de arquivo, então *
(qualquer caractere) é comum, geralmente seguido por um símbolo específico como /
ou.
Exemplos:
Dada uma variável como
MYVAR="users/joebloggs/domain.com"
Remova o caminho deixando o nome do arquivo (todos os caracteres até uma barra):
echo ${MYVAR##*/}
domain.com
Remova o nome do arquivo, deixando o caminho (exclua a correspondência mais curta após a última /
):
echo ${MYVAR%/*}
users/joebloggs
Obtenha apenas a extensão do arquivo (remova tudo antes do último período):
echo ${MYVAR##*.}
com
NOTA: Para fazer duas operações, você não pode combiná-las, mas deve atribuir a uma variável intermediária. Portanto, para obter o nome do arquivo sem caminho ou extensão:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
vez de%
. Se você quiser apenas a parte após o último dois pontos, use${MYVAR##*:}
para obter a parte após os primeiros dois pontos, use${MYVAR#*:}
${RET##*$CHOP}
ou assim${RET##*CHOP}
(ou de outra forma)? EDITAR: parece ser o primeiro,${RET##*$CHOP}
Defina uma função como esta:
E passe a string como parâmetro:
fonte
echo $1 | cut -d -f 1 | xargs
. 1 para ans simples e arrumado.E quanto ao sed? Isso funcionará em um único comando:
#
estão sendo usados para divisores regex em vez de,/
uma vez que a string está/
nele..*/
agarra a corda até a última barra invertida.\( .. \)
marca um grupo de captura. Isto é\([^:]*\)
.[^:]
diz qualquer caractere _ exceto dois pontos e*
significa zero ou mais..*
significa o resto da linha.\1
significa substituir o que foi encontrado no primeiro (e único) grupo de captura. Este é o nome.Aqui está a análise combinando a string com a expressão regular:
fonte
Usando um único sed
fonte
Usando um único Awk:
Ou seja, usando como separador de campo
/
ou:
, o nome de usuário está sempre no campo 5.Para armazená-lo em uma variável:
Uma implementação mais flexível com
sed
isso não exige que o nome de usuário seja o campo 5:Ou seja, exclua tudo de
:
e além e, em seguida, exclua tudo até o último/
.sed
provavelmente também é mais rápido do queawk
, então esta alternativa é definitivamente melhor.fonte