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:
- Para todas as linhas que começam com um não comentado
UserDir enabled, ele remove o usuáriofoo(mas não, por exemplo, um usuáriofoobar). - 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
-ee é 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 oFILE-IN >FILE-OUTpor-i FILE. - Isso funciona com certeza no Linux. Sua milhagem pode variar com
sedversõ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.