Aqui estão algumas abordagens. Estou usando a expansão de chaves ( file{1..4}.txt ), o que significa file1.txt file2.txt file3.txt file4.txt
-
Perl
perl -i -pe 's/.*/ Good Morning / if $.==5' file{1..4}.txtExplicação:
-
-i: faz com queperledite os arquivos no lugar, alterando o arquivo original.Se
-ifor seguido com um sufixo de extensão de arquivo, um backup será criado para cada arquivo modificado. Ex:-i.bakcria umfile1.txt.baksefile1.txtfor modificado durante a execução. -
-p: significa ler o arquivo de entrada linha a linha, aplicar o script e imprimi-lo. -
-e: permite que você passe um script da linha de comando. -
s/.*/ Good Morning /: Isso substituirá o texto da linha atual (.*) pelo bom dia. -
$.é uma variável Perl especial que contém o número da linha atual do arquivo de entrada. Portanto,s/foo/bar/ if $.==5, significa substituirfooporbarapenas na quinta linha.
-
-
sed
sed -i '5s/.*/ Good Morning /' file{1..4}.txtExplicação:
-
-i: como paraperl, edite o arquivo no lugar.
Por padrão,
sedimprime cada linha do arquivo de entrada. O5s/pattern/replacement/significa padrão substituto com substituição na quinta linha. -
-
Awk
for f in file{1..4}.txt; do awk 'NR==5{$0=" Good Morning "}1;' "$f" > foobar && mv foobar "$f"; doneExplicação:
awknão tem equivalente à-ioption¹, o que significa que precisamos criar um arquivo temporário (foobar) que será renomeado para substituir o original. O laço bashfor f in file{1..4}.txt; do ... ; donesimplesmente passa por cadafile{1..4}.txt, salvando o nome do arquivo atual como$f. Emawk,NRé o número da linha atual e$0é o conteúdo da linha atual. Assim, o script substituirá a linha ($0) por "Bom dia" somente na quinta linha.1;éawkpara "imprimir a linha".¹ As versões mais recentes são mostradas como devnull em sua resposta .
-
coreutils
for f in file{1..4}.txt; do (head -4 "$f"; echo " Good Morning "; tail -n +6 "$f") > foobar && mv foobar "$f"; doneExplicação:
O loop é explicado na seção anterior.
-
head -4: imprima as primeiras 4 linhas -
echo " Good Morning ": print "Bom dia" -
tail -n +6: imprima tudo da sexta linha até o final do arquivo
Os parênteses
( )em torno desses três comandos permitem capturar a saída de todos os três (assim, as primeiras 4 linhas, depois "bom dia" e depois o restante das linhas) e redirecioná-las para um arquivo. -