Substituir linha no arquivo de texto com entrada do usuário no terminal

0

Estou tentando solicitar ao usuário duas informações:

1) O número da linha no arquivo a ser alterado 2) O valor para alterá-lo para.

Meu script até agora:

echo "Do you wish to enter a variable to be changed?"
select yn in "Yes" "No"; do
  case $yn in
    Yes)
      echo "Please enter a variable to be changed"
      read lineNum
      echo "Please enter variable's new value"
      read val
      awk -v lineNum="$lineNum" -v val="$val" \
       'BEGIN { if (NR == lineNum) print val; else print $0}' \
        test.in > newtest.in
      ;;
    No)
      break;;
  esac
done

O test.in tem valores numéricos todos em uma coluna:

1
2
3
4
5
6
7

Obrigado.

EDITAR Esqueceu de mencionar o erro: D. Por alguma razão, o novo arquivo é criado, mas apenas com o novo val que foi especificado, imagino que isso possa ter algo a ver com o uso de $ 0, mas não consegui descobrir como corrigi-lo.

    
por Gregory 06.04.2018 / 18:02

1 resposta

4

Em awk o BEGIN block / rule está sendo executado antes que o primeiro registro de entrada seja lido e somente uma vez , para que o script e o awk funcionem é necessário removê-lo, pois awk executará esse bloco para cada entrada / leituras de registros.

Eu pessoalmente também uso a condição Ternary quando eu tenho apenas uma instrução action / else.

awk '{ print (NR==lineNum)?val:$0 }' 
    
por 06.04.2018 / 18:40