Tente isso (Chris, você está muito perto):
sed -i '' 's|export TODO_FILE="$TODO_DIR/todo.txt"|export TODO_FILE="$TODO_DIR/writing.txt"|g' ~/.todo/config
Eu quero substituir esta string:
export TODO_FILE="$TODO_DIR/todo.txt
com:
export TODO_FILE="$TODO_DIR/writing.txt"
no arquivo ~/.todo/config
. Eu corri com:
sed -i 's/export TODO_FILE="$TODO_DIR/todo.txt"/export TODO_FILE="$TODO_DIR/writing.txt"/g' ~/.todo/config
Mas diz:
sed: -i may not be used with stdin
O que devo fazer?
Melhor primeiro corresponder a linha e depois substituir a parte
sed -i '/export TODO_FILE/ s/todo.txt/writing.txt/' ~/.todo/config
Isso se torna curto quando você tem uma variável de caminho muito longa.
e, como mencionado na resposta anterior, use outro separador ao lidar com o caminho.
Eu não acho que o problema seja o cifrão, porque ele está entre aspas simples. Supondo que você esteja usando bash, as strings entre aspas simples não são expandidas por variável .
Um dos seus problemas é que você escolheu um caractere separador (o primeiro caractere após o comando "s") que existe em suas strings find / replace - "/". Isso está sendo interpretado de maneira diferente do que você está esperando. Você deve escolher um caractere diferente que não apareça nas strings de localizar / substituir, como "|".
sed -i 's|export TODO_FILE="$TODO_DIR/todo.txt"|export TODO_FILE="$TODO_DIR/writing.txt"|g' ~/.todo/config
No entanto, isso não explica sua mensagem de erro específica.
Talvez você esteja usando a versão do BSD, que aparentemente trata o -i de forma diferente ?
Tags sed