テキストファイルの行を端末のユーザー入力に置き換える

テキストファイルの行を端末のユーザー入力に置き換える

ユーザーに2つの情報を要求したいと思います。

1) 変更するファイルの行番号 2) 変更する値。

これまで私のスクリプトは次のようになりました。

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

test.inはすべての値を1つの列に入れます。

1
2
3
4
5
6
7

ありがとうございます。

編集する バグに言及することを忘れました:D。何らかの理由で新しいファイルが作成されましたが、指定された新しい値のみを使用して$ 0を使用することに関連している可能性があると思いますが、問題を解決する方法はわかりません。

答え1

存在するawk これスタートブロック/ルールは、最初の入力レコードを読み取る前に一度だけ実行されます。、スクリプトとawkが機能するためにはここでは必要ないので、それを削除する必要があります。これにより、awkブロックはすべての入力/レコード読み取りに対して実行されます。

私も個人的に使用しています。3元1つのジョブ/別のステートメントのみがある状況です。

awk '{ print (NR==lineNum)?val:$0 }' 

関連情報