Você não pode (com segurança) redirecionar a saída de um comando para um arquivo que está sendo lido. Você está "com sorte" por ter funcionado na linha de comando. Provavelmente, em um caso sed
foi capaz de ler o arquivo inteiro antes que o shell o derrotasse, e no outro caso não foi. A diferença é provavelmente devido a algum problema de buffer, mas não vale a pena descobrir isso.
Se você quiser modificar um arquivo, você deve gravar a saída em um arquivo temporário e (se tiver êxito) renomear o arquivo temporário para o nome do arquivo de entrada.
Por exemplo:
sed "1s%.*%baz%" test.txt > $$ && mv $$ test.txt
$$
é o ID do processo do shell atual; é uma maneira conveniente de obter um nome de arquivo razoavelmente exclusivo. Ou você pode usar, digamos, test.txt.$$
ou mesmo tmp
se não tiver algo com esse nome.
No caso particular do comando sed
, você pode usar a opção -i
para modificar um arquivo - mas isso só faz com que sed
crie um arquivo temporário internamente. A sintaxe, ou mesmo a existência, se a opção -i
puder variar de uma implementação sed
para outra; verifique sua documentação local.