将文本文件中的行替换为终端上的用户输入

将文本文件中的行替换为终端上的用户输入

我试图提示用户输入两条信息:

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
2
3
4
5
6
7

谢谢。

编辑 忘了提及错误:D。由于某种原因,创建了一个新文件,但仅使用指定的新值,我想这可能与使用 $0 有关,但我无法弄清楚如何修复它。

答案1

awk 开始块/规则在读取第一个输入记录之前执行,并且仅执行一次,为了让你的脚本和 awk 工作,你需要删除它,因为这里不需要,然后awk将为每个输入/记录读取执行该块。

我个人也用三元当我只有一个动作/其他语句时的情况。

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

相关内容