Escreva em um arquivo no local específico

2

Estou tentando criar um script que adicione um usuário à lista UserDir enabled ou o remova da UserDir disabled list em userdir.conf .

Para a minha pergunta, digamos que eu tenha o seguinte arquivo:

Lorem ipsum
Lorem ipsum
    List 1 enabled
Lorem ipsum
Lorem ipsum
    List 2 disabled
Lorem ipsum

O que eu gostaria de fazer é quando eu executar meu script com o seguinte ./script enabled user é modificar meu arquivo para:

Lorem ipsum
Lorem ipsum
    List 1 enabled user
Lorem ipsum
Lorem ipsum
    List 2 disabled
Lorem ipsum

Depois, se eu fizer ./script disabled user , ele removerá o usuário da Lista 1 e adicionará a ele a lista 2. Assim, a saída do arquivo seria:

Lorem ipsum
Lorem ipsum
    List 1 enabled
Lorem ipsum
Lorem ipsum
    List 2 disabled  user
Lorem ipsum

A minha pergunta não é sobre como escrever este script, trata-se de como adicionar / eliminar texto para / de um ficheiro numa localização específica .

Pergunta fora do tópico: Existe uma maneira melhor de adicionar / remover usuários na lista UserDir do apache2?

    
por Dragos Rizescu 16.12.2013 / 14:19

2 respostas

2

Isso pode ser feito com sed ou awk . Faça sua escolha. Pessoalmente, gosto de usar a ferramenta com a menor pegada. Você pode, é claro, fazê-lo em qualquer linguagem de programação como código de máquina Perl, C, SNOBOL ou PDP-8, mas isso pode estar um pouco além do escopo da questão. ;)

Para excluir um usuário da linha UserDir enable usando sed:

sed -e '/^[^#]*UserDir\s\+enabled\s\+/ s/\bfoo\b//g' -e 's/\s\+/ /g' FILE-IN >FILE-OUT

Isso faz duas coisas:

  1. Para todas as linhas que começam com um não comentado UserDir enabled , ele remove o usuário foo (mas não, por exemplo, um usuário foobar ).
  2. Remove o espaço em branco supérfluo.

Para adicionar um usuário:

sed -e '/^[^#]*UserDir\s+enabled\s+/ s/\(\s\+#\|$\)/ bar/' FILE-IN >FILE-OUT

Isso procurará todas as linhas como Userdir enabled que não foram comentadas, como antes. Para todas as linhas encontradas, ele adicionará o usuário bar no final. Se a linha termina em um comentário, o comentário é respeitado e deixado lá.

Para adicionar uma nova linha UserDir enabled após a linha UserDir disabled :

sed -e '/^[^#]*UserDir\s+enabled\s+/ a UserDir disabled foo bar baz' FILE-IN >FILE-OUT

Isso usa o comando append ( a ) sed para adicionar texto após todas as linhas não comentadas como UserDir enabled ... . Altere o a para um i para inserir antes da linha correspondente.

Algumas notas:

  • Obviamente, altere "ativado" para "desativado" à vontade.
  • Usamos \s+ em vez de espaços para capturar casos em que outras formas de espaço em branco são usadas (por exemplo, guias) e / ou vários caracteres de espaço em branco são encontrados.
  • Você pode combinar as duas operações. Sed pode executar várias expressões em cada arquivo. Cada expressão é fornecida após a opção -e e é executada em ordem, da esquerda para a direita.
  • Observe que alguns caracteres que não são escapados em alguns dialetos de expressões regulares são ignorados pelo sabor da expressão regular usado por sed .
  • Isso exigirá um arquivo temporário ( FILE-OUT ) para armazenar o arquivo editado ( FILE-IN ). Se você quiser invocar estes no local (sem redirecionar para um arquivo temporário), substitua o FILE-IN >FILE-OUT por -i FILE .
  • Isso funciona com certeza no Linux. Sua milhagem pode variar com sed versões de outros Unices. Você pode achar que -i (acima) não está disponível e que o suporte a expressões regulares é mais limitado.

Resposta fora do tópico: seria muito mais fácil se o Apache permitisse inserir várias diretivas UserDir e adicionasse as listas de usuários. Pode fazer isso, mas uma verificação superficial veio em branco. Eu nunca tive que fazer isso, então não tenho certeza se é possível.

    
por 16.12.2013 / 15:41
0

Tais tarefas são mais simples de serem resolvidas recriando o arquivo da (s) origem (s). Parece pré-processamento e é muito mais eficaz construir o resultado a partir de fontes, em vez de corrigir o arquivo resultante.

    
por 16.12.2013 / 15:33