Como posso encontrar correspondências com sed (ou similar) para parâmetros de configuração?

3

Sou muito bom em usar os comandos preg_match (e similares) do php e também sou muito bom com expressões regulares, mas não me dou muito bem com sed .

Eu tenho dois scripts de shell em que estou trabalhando e gostaria de extrair algumas variáveis dos arquivos de configuração.

Primeiro arquivo

O primeiro arquivo é um arquivo .htaccess e eu quero pegar o endereço da web, que estará em um bloco assim:

RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]

A sintaxe do arquivo .htaccess será bem regular, então eu sinto que devo usar um padrão similar a #.*(http.*?)\$#is , o que faz:

  • expressão regular
  • delimitado por #
  • 0 ou mais caracteres antes de http
  • começa a capturar no http com o símbolo não ganancioso?
  • continue capturando até atingir um cifrão real (com escape)
  • não diferencia maiúsculas de minúsculas
  • ignorar espaços em branco / novas linhas

Como posso usar essa expressão regular com um comando como sed para que eu coloque a parte entre parênteses se corresponder e nada (string vazia) se ela não corresponder?

Eu seria melhor usar outro comando além de sed se eu estivesse acostumado com o PCRE do php?

Segundo arquivo

O segundo arquivo é um pouco diferente porque é um arquivo .ini e, por isso, gostaria de saber se poderia haver alguma mágica de shell (eu uso bash ) para analisá-lo. O pedaço que eu quero é assim:

[Database]
database          = mysql://user:password@localhost/database

Se eu estivesse usando PHP e expressões regulares, faria algo assim:

#\s+database\s*=\s*mysql://([\:]+):([\@]+)@([\/]+)/(.*?)\s+#is

No PHP existe um analisador .ini, mas eu quero que seja um script shell / bash, não um script PHP

Como posso usar essa expressão regular para obter as credenciais de conexão do banco de dados?

    
por cwd 27.11.2012 / 20:06

2 respostas

3

Se você quiser usar expressões regulares semelhantes a perl, por que não usar o perl (que é encontrado em 99% dos Unices não incorporados)?

Como:

perl -lne 'print for /(http.*?)\$/'

perl -lne 'print for m{database\s*=\s*mysql://([^:@]+):([^@]+)@([^/]+)/(\S+)}i'

/.../ é a forma mais curta de m/.../ . O m/.../ one permite outros caracteres além de / e também pares como m{...} , m(...) .

something for @list runs something looping como a variável $_ nos valores da lista. m{...} em contextos de lista retorna a lista de padrões capturados (dentro de (...) ). print sem argumentos, imprime $_ .

    
por 27.11.2012 / 21:24
3

Tente

grep -oP <your_pattern> <your_file>

O -P garante que grep interprete seu regex à la Perl e -o faça com que ele retorne apenas o que correspondeu.

EDIT: Note que seu grep pode não necessariamente suportar quantificadores preguiçosos, portanto, se você não espera que as URLs sejam executadas em várias linhas, eu usaria um quantificador voraz sem o modificador /s .

    
por 27.11.2012 / 20:17