Parsing de permissões estranhamente formatadas

1

Eu tenho um problema em que tenho batido minha cabeça por um tempo, estou fazendo um curto e simples analisador bash e tentando extrair 3 coisas de muitas linhas, e as coloco em variáveis recém formatadas. eles são todos formatados como abaixo:

ownername:read write execute groupname:read execute all:none  sticky

Estou tentando colocar cada parte em variáveis como abaixo:

Proprietário (primeiro bloco)

OWNER=$(ownername)

Grupo (segundo bloco)

GROUP=$(groupname)

e finalmente permissões (todos os blocos, mas com nome de usuário / nome de grupo substituído por proprietário e grupo_principal)

PERMISSIONS=$(owner:read write execute primary_group:read execute all:none sticky)

Isso pareceu uma tarefa bastante simples no começo, no entanto, tentar resolver isso com meu conhecimento básico de awk é difícil, pois algumas áreas podem ser rwx e outras rw / ro, assim como o proprietário / grupo não ser único ( não permitindo um simples sed)

Quais são alguns dos primeiros passos que posso dar para abordar isso?

Para colocar de forma mais clara:

Entrada:

ownername:read write execute groupname:read execute all:none  sticky

Saída:

OWNER=ownername
GROUP=groupname
PERMISSIONS=owner:read write execute primary_group:read execute all:none  sticky
    
por Kellen 09.01.2017 / 15:50

1 resposta

0

Eu acho que você quer dividir a entrada para as partes que têm uma única palavra, dois-pontos e outras palavras. Seria mais fácil se as seções fossem separadas, mas você poderia, por exemplo adicione separadores com algo parecido com isto:

echo "ownername:read write execute groupname:read execute all:none  sticky" | \
   sed -e 's/\w\w*:/;&/g'
;ownername:read write execute ;groupname:read execute ;all:none  sticky

A divisão no ponto-e-vírgula deve ser possível a partir disso.

Fragmento Perl obrigatório, dividindo as partes diretamente em uma matriz:

echo "ownername:read write execute groupname:read execute all:none  sticky" | \
  perl -ne '@a = split/ (?=\w+:)/; print "$_\n" for @a'
ownername:read write execute
groupname:read execute
all:none  sticky
    
por 09.01.2017 / 16:19