sed -i -E 's/[0-9]+/(&)/' in
Alternativamente,
sed -E 's/[0-9]+/(&)/' in | tee in
sobrescreve o arquivo E fornece a saída no stdout.
isso funciona como eu esperava:
$ cat in
abc 123
$ sed -E -i .bk 's/[0-9]+/(&)/' in
$ cat in
abc (123)
$ cat in.bk
abc 123
Mas não isso:
$ cat in
abc 123
$ sed -E 's/[0-9]+/(&)/' in
abc (123)
$ sed -E 's/[0-9]+/(&)/' in > in
$ cat in
Como posso modificar o conjunto de comandos acima, de modo que o último comando retorne:
abc (123)
?
Pergunta: Modificando um arquivo com sed
usando redirecionamento .
Resposta: obviamente, a opção -i
foi adicionada a sed
por um motivo. Apenas usar redirecionamento deixa você olhando para uma solução um pouco complicada.
cat in | cat - | sed -E 's/[0-9]+/(&)/' > in
O seguinte também funciona, mas apenas se o arquivo de entrada contiver uma única linha:
cat in | parallel 'echo {} | sed -E "s/[0-9]+/(&)/" > in'
sed -E 's/[0-9]+/(&)/' in | parallel 'echo {} >in'
Explicação: A explicação é fornecida por Paulo em seu comentário à questão (o redirecionamento é interpretado antes que o comando seja executado). Minha solução é adicionar um nível de indireção entre ler o arquivo e escrever de volta nele.