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}.txt
Explicação:
-
-i
: faz com queperl
edite os arquivos no lugar, alterando o arquivo original.Se
-i
for seguido com um sufixo de extensão de arquivo, um backup será criado para cada arquivo modificado. Ex:-i.bak
cria umfile1.txt.bak
sefile1.txt
for 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 substituirfoo
porbar
apenas na quinta linha.
-
-
sed
sed -i '5s/.*/ Good Morning /' file{1..4}.txt
Explicação:
-
-i
: como paraperl
, edite o arquivo no lugar.
Por padrão,
sed
imprime 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"; done
Explicação:
awk
não tem equivalente à-i
option¹, 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 ... ; done
simplesmente 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;
éawk
para "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"; done
Explicaçã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. -