SED Localizar e substituir w \ Expressões regulares

1

Tudo bem, então estou confuso & fora de ideias.

Estou tentando substituir todos os endereços IP antigos por um novo.

find -type f | grep \.php$ | xargs sed -r -i "s/(\'|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.5)(\'|\")/\"10.0.32.165\"/g"

Estou tentando encontrar todos os arquivos PHP e substitua qualquer um dos seguintes (localhost, 127.0.0.1, 10.0.32.4, 10.0.32.5) por 10.0.32.165.

find * | grep \.php$ | xargs egrep "(\'|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.5)(\'|\")"

Depois que o primeiro comando é executado, quero ter certeza de que não há vestígios de valores antigos, então eu corro o comando acima, mas ele infelizmente retorna

siteeval/application/libraries/fetcher.url.class.php:    $this->host = "10.0.32.4";

Alguém vê o que estou fazendo errado? ou talvez possa me indicar uma maneira melhor de fazer isso?

    
por GruffTech 04.08.2009 / 19:38

3 respostas

2

Tente isto:

sed -e 's/\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)/10.0.32.165/g'

Você precisa escapar dos parênteses e dos tubos. Se você quiser ter certeza de que eles estão sempre entre aspas, tente:

sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'

Teste um pouco:

$ echo '"10.0.32.4"' | sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
10.0.32.165
$ echo '"localhost"' | sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
10.0.32.165

Uma sugestão para o futuro. Sempre tente primeiro com pequenas amostras (usando eco como este), antes de passar para o caso complicado.

* Edit: Escapou os pontos também.

    
por 04.08.2009 / 22:37
1

1) Você tem que escapar de períodos, um período corresponde a qualquer personagem. Então, para que ele corresponda a um período literal, você precisa escapar dele colocando uma barra invertida antes:

\.

Parece que funciona, porque o período de meta-caracteres ainda corresponde a um período.

2) Você realmente precisa corresponder apenas aos IPs que estão entre aspas? Se você não precisa se preocupar em combiná-los e colocá-los de volta, isso torna tudo ainda mais confuso.

3) Qualquer motivo que você não pode simplificar isso, executando o comando várias vezes para cada IP?

4) Endereço IP correspondente com regex leva a insanidade e, possivelmente, convulsões, considere algo como Perl's Net :: IP :: Match :: Regexp : -)

5) Você tem certeza de que não há retornos de carro nesse arquivo confundindo sed? tente cat -vE e procure por ^ M

6) Livre-se do grep e apenas passe -name '* .php' para localizar

    
por 04.08.2009 / 19:42
0

Eu acho que o único problema que você tem é que você precisa descomprimir as aspas simples. Eu gosto disso um pouco melhor, no entanto:

find -type f -name '*.php' | xargs sed -r -i "s/\('|\"\)\(localhost|127.0.0.1|10.0.32.4|10.0.32.5\)\('|\"\)/${1}10.0.32.165${3}/g"

Além de não vazar as aspas simples, estou salvando o caractere de aspas correspondidas, para que ele possa ser restaurado em torno do novo IP. Aqui está o grep:

find . -type f -name '*.php' | xargs egrep "('|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.165)('|\")"
    
por 04.08.2009 / 20:09

Tags