Você está se preparando para alguma complicação aqui, já que barras invertidas são interpretadas
- pelo shell dentro da substituição do comando,
- pelo shell fora da substituição do comando,
- por sed.
Primeiro, não use a forma backtick de substituição de comando: suas regras para citações internas são intrincadas. Use parênteses em dólar, que tem regras intuitivas - o que está dentro é analisado normalmente, com o parêntese próximo correspondente marcando o fim da subcamada.
Então você está usando aspas duplas para um comando sed. Evite isso: seu comando sed não pode ser escrito literalmente, você precisa proteger \
e $
para o shell e para o sed. Use aspas simples em vez disso.
Além disso, você tem barras no texto de substituição. Sed não pode saber que essas barras não fazem parte de sua sintaxe, mas texto literal que você deseja incluir. Você pode usar um caractere diferente de /
para delimitar um comando s
, g
ou m
. Use um personagem que nunca aparece no seu texto substituto (felizmente, aqui, é fácil porque você conhece o texto de substituição).
Presumo que echo pwd
deve ser realmente pwd
(ou echo "$PWD"
). Sem a necessidade de proteger as barras, você não precisa da chamada sed aninhada. Se você precisou transformar pwd
, considere usar $PWD
e os recursos de manipulação de string do shelll.
sed -i 's~^log.*$!log '"$PWD"'/redis/redis.log!' ./conf/redis.conf
Se você tiver dificuldades com as citações, não hesite em usar uma ferramenta mais fácil, como o Perl. O Perl combina os recursos do sed e do shell, para que você não encontre problemas entre os dois.
perl -MCwd -i -pe 'BEGIN {$PWD = cwd} s[^log.*][log $PWD/redis/redis.log]' conf/redis.conf
ou
perl -MCwd -i -pe '$_ = cwd."/redis/redis.log" if /^log' conf/redis.conf