Oi, @arilton.
Para incluir qualquer conteúdo em um arquivo, independente do comando usado, deve-se usar os caracteres >>
. Isso faz com que tudo o que for impresso na saída padrão seja redirecionado para o arquivo. Com >>
(dois caracteres) o conteúdo é anexado ao fim do arquivo, e com >
(apenas um caractere) o conteúdo do arquivo é apagado e o conteúdo passado é inserido no lugar.
Então, sabendo que o comando echo
imprime algum texto na saída padrão (terminal), ao executar echo "xyz" >> arquivo.txt
o texto “xyz” será anexado ao fim do arquivo. Da mesma forma, se você usar o comando cat
, que imprime o conteúdo de um arquivo na saída padrão, seguido de >>
, a saída do cat
será anexado ao arquivo. Ex.: cat entrada.txt >> saida.txt
.
Isso é válido para qualquer comando que imprima alguma coisa na saída padrão. A exceção são saídas de erros que, embora sejam impressos no terminal da mesma forma, são tratado de forma um pouco diferente. Se é este seu caso, avise que eu explico melhor.
Sobre a substituição de uma linha, isso é um pouco mais complicado, não pelo comando mas para garantir que apenas a linha desejada será alterada. Há mais de uma forma de fazer isso, mas a mais tradicional é usar o sed
. A sintaxe é: sed "s/<expressão regular para selecionar a linha>/<conteudo que sera inserido no lugar>/g"
. O s
significa que será feita uma substituição, e o g
é para substituir todos os encontrados. Porém, é preciso dar uma entrada para o sed
. Isso pode ser feito usando o cat
, ou qualquer comando que imprima algo na saída padrão, seguido do caractere|
, que transfere a saída do comando anterior para o comando seguinte, ou usando a opção -i <arquivo>
, para fazer a substituição diretamente no arquivo.
Então suponha que o conteúdo do arquivo “arq.txt” seja:
abc
1234567890
bruno
Para substituir todos os caracteres “b” por “FUNCIONA” e imprimir isso na tela, usa-se o comando:
cat arq.txt | sed "s/b/FUNCIONA/g"
O que será impresso é:
aFUNCIONAc
1234567890
FUNCIONAruno
Para substituir uma linha que comece em “1”, que acabe em “0” e só tenha números no “meio” por “numeros”, diretamente no arquivo:
sed -i arq.txt "s/^1[0-9]*0$/numeros/g"
O conteúdo do arquivo após o comando será:
abc
numeros
bruno
A dificuldade começa quando o arquivo possui muitas linhas parecidas, e você quer mexer apenas em uma parte de uma específica, sem uma garantia que ela seja sempre igual. Dependendo do caso, a expressão regular que terá que ser usada pode ser bem complexa. Neste caso eu recomendo que dê uma boa estudada em expressões regulares. É fácil achar bons materiais procurando por “expressão regular” no Google. E sempre recomendo testar várias vezes com a sintaxe cat <arq> | sed "..."
, antes de usar a opção sed -i <arq> "..."
.
Acho que é isso. Qualquer dúvida é só falar.