Tente isto:
sed -i.bak "s:^.*\(\$cache_directory = \)\('./cache'\):$new_cache_directory:" infile
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?
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 '#'.
Tags bash scripting shell-script