Comando para inserir uma linha em uma arquivo de texto

Sei que existe um comando para fazer isso mas não sei qual e gostaria da ajuda de quem puder dar essa força.

Como faço para incluir um texto dentro de uma arquivo de texto via linha de comando sem precisar abrir o arquivo com editor de texto?

Se existir alguma forma de localizar uma linha em uma arquivo de texto e substituir por outra linha via comando tbm agradeceria.

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.

3 curtidas