Usando sed para substituir uma linha por muitos caracteres especiais?

2

Estou escrevendo um script bastante volumoso para um projeto e um dos problemas que estou encontrando antes de concluir é usar o comando sed.

Estou tentando encontrar uma linha que tenha (localizada em cache.php):

$cache_directory = './cache'; 

e substitua as informações em './cache' por uma variável chamada $new_cache_directory .

Um dos problemas que estou encontrando é o ./cache existir várias vezes. Eu só quero substituir essa linha, mas eu também não quero "codificar" o número da linha para "prova futura" dele.

Como posso fazer isso?

    
por jason.dot.h 26.05.2011 / 03:42

2 respostas

5

Tente isto:

sed -i.bak "s:^.*\(\$cache_directory = \)\('./cache'\):$new_cache_directory:" infile
    
por 26.05.2011 / 06:17
2

Então, eu acho que você quer substituir 'cache' pelo conteúdo da dita variável, não pelo seu nome:

sed 's#^$cache_directory = ../cache.;#$cache_directory = '$new_cache_directory'#' script.php

Então, você tem problemas diferentes para resolver: Normalmente, um comando sed usa barras para separar as partes: 's / foo / bar /'. Ao lidar com caminhos, isso é perturbador, mas podemos usar muitos delimitadores - eles são apenas implicitamente declarados seguindo o 's'.

O problema 2 é semelhante. Geralmente, especificamos o comando entre aspas simples:

sed 'command' file 

Mas aqui temos apóstrofes ao redor ./cache - o que fazer? Uma ideia seria, usar

sed "command" file 

em vez disso, que geralmente funciona, mas não aqui. Os apóstrofos impedem que o sinal de dólar seja interpretado, mas as citações não impediriam isso. Muitas vezes, você nem precisa de apóstrofos e pode escrever:

sed s/standart/standard/g sample.txt 

mas, novamente, você tem $ cache_directory como uma variável no comando, que seria interpretada. Então, eu apenas substituo os apóstrofos pelo sinal do joker, ponto, e ficaria realmente surpreso, se alguma outra expressão combinasse com essa parte: ../cache. like xy/cachei - não é muito provável, é?

Mas você quer que $ new_cache_directory seja substituído pelo conteúdo da variável, então eu mudo o mascaramento com = ' , insiro a variável e mudo o mascaramento novamente para terminar o comando com '#'.

    
por 26.05.2011 / 05:58