Você deve citar o caractere $ quando ele for para si mesmo dentro de uma string em doublequotes; caso contrário, o shell pensará que ele introduz uma expansão de variável e ficará infeliz se o caractere após ele não for alfabético ou uma das variáveis especiais.
sed -i "s/cb $i\$/cb $i $cb/" */callback_events
Existem dois níveis de interpretação de caracteres aqui.
-
Primeiro, o shell lê o comando e aplica suas regras. Uma das regras é que dentro de doublequotes
$introduz expansão de variáveis, a menos que seja citada. -
Depois que o shell terminar, o comando ficará assim:
sed -i s/cd <value-of-i>$/cd <value-of-i> <value-of-cb/ dir1/callback_events dir2/callback_events...Observe que as aspas desapareceram,
$ie$cbforam substituídas por seus valores e\$se tornou apenas$. Também*/callback_eventsfoi substituído por uma lista de arquivos. -
Isso é passado para
sed, que aplica as regras its . Uma dessas regras é que$no final do padrão de pesquisa significa fim de linha.