텍스트 파일의 줄을 터미널의 사용자 입력으로 바꾸기

텍스트 파일의 줄을 터미널의 사용자 입력으로 바꾸기

사용자에게 두 가지 정보를 요청하려고 합니다.

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해당 블록은 모든 입력/레코드 읽기에 대해 실행됩니다.

저도 개인적으로 사용하고 있어요3위안하나의 작업/다른 명령문만 있는 상황입니다.

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

관련 정보