Vamos supor que você queira substituir a linha 4 pelo texto "diferente". Você pode usar o AWK assim:
awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt
O AWK considera a entrada como "registros" divididos em "campos". Por padrão, uma linha é um registro. NR
é o número de registros vistos. $0
representa o registro completo atual (enquanto $1
é o primeiro campo do registro e assim por diante; por padrão, os campos são palavras da linha).
Portanto, se o número da linha atual for 4, imprima a string "diferente", mas imprima a linha inalterada.
No AWK, o código do programa incluído { }
é executado uma vez em cada registro de entrada.
Você precisa citar o programa AWK entre aspas simples para impedir que o shell tente interpretar coisas como o $0
.
EDIT: Um programa AWK mais curto e mais elegante da @chepner nos comentários abaixo:
awk 'NR==4 {$0="different"} { print }' input_file.txt
Somente para o registro (ou seja, linha) número 4, substitua o registro inteiro pela string "diferente". Em seguida, para cada registro de entrada, imprima o registro.
Claramente, minhas habilidades no AWK estão enferrujadas! Obrigado, @chepner.
EDIT: e veja também uma versão ainda mais curta de @Dennis Williamson:
awk 'NR==4 {$0="different"} 1' input_file.txt
Como isso funciona é explicado nos comentários: o 1
sempre avalia true, portanto, o bloco de código associado sempre é executado. Mas não há nenhum bloco de código associado, o que significa que o AWK faz sua ação padrão de apenas imprimir a linha inteira. O AWK foi projetado para permitir programas concisos como este.