입력 파일 덮어쓰기

입력 파일 덮어쓰기

입력 파일 내용을 변환된 출력으로 바꾸는 솔루션에는 임시 파일을 사용하거나스펀지유용.

스티븐 차제라스 답변이는 아래와 같이 읽기-쓰기 모드로 파일을 여는 또 다른 방법을 나타냅니다.

tr ' ' '\t' < file 1<> file

관련 파일을 손상시키지 않고 실제로 어떻게 작동합니까?

답변1

이는 tr파일 크기가 변경되지 않기 때문에 작동합니다.

1<>filefile오버레이 모드에서 표준 출력으로 열립니다. ( <>읽기/쓰기 모드라고 하지만 읽는 프로그램이 거의 없기 때문에 stdout실제로 수행하는 작업에 집중하는 것이 더 유용합니다.)

일반적으로 출력( )을 리디렉션하면 >file파일이 "쓰기" 모드로 열리므로 파일이 생성되거나 지워집니다. 또 다른 일반적인 옵션은 >>file파일 지우기를 건너뛰고 모든 출력을 끝에 두는 "추가" 모드입니다. 1<>file또한 파일 지우기를 건너뛰지만 쓰기 커서를 파일 시작 부분에 배치합니다. ( 기본값이 대신 리디렉션이기 1때문에 이것이 필요합니다 ).<>stdinstdout

이렇게 정확하게 수정되는 유틸리티는 거의 없기 때문에 이는 가끔씩만 유용합니다. 또 다른 경우는 대체 길이가 원래 길이와 정확히 동일한 검색 및 대체입니다. (더 짧은 대체 방법도 작동하지 않습니다. 파일이 끝 부분에서 잘리지 않기 때문입니다. 출력이 원본 파일보다 짧으면 파일 끝 내용은 여전히 ​​파일 끝에서 끝납니다. )

답변2

구문을 사용하여 파일을 읽기 전용으로 열고 < file파일의 행을 표준 입력(STDIN, 즉 파일 설명자 0)으로 읽는 경우. 그런 다음 표준 출력(STDOUT, 즉 파일 설명자 1)이 읽기+쓰기(1<>)를 위해 열리고 그에 따라 각 줄의 내용이 기록됩니다.

이 섹션에서 I/O + Bash에 대한 자세한 내용을 읽을 수 있습니다.20장 I/O 리디렉션, "고급 Bash 스크립팅 가이드".

발췌

   [j]<>filename
      #  Open file "filename" for reading and writing,
      #+ and assign file descriptor "j" to it.
      #  If "filename" does not exist, create it.
      #  If file descriptor "j" is not specified, default to fd 0, stdin.
      #
      #  An application of this is writing at a specified place in a file. 
      echo 1234567890 > File    # Write string to "File".
      exec 3<> File             # Open "File" and assign fd 3 to it.
      read -n 4 <&3             # Read only 4 characters.
      echo -n . >&3             # Write a decimal point there.
      exec 3>&-                 # Close fd 3.
      cat File                  # ==> 1234.67890
      #  Random access, by golly.

동일한 파일을 여러 번 열면 어떻게 해야 합니까?

이 U&L Q&A에서 파일 설명자가 어떻게 작동하는지 확인하세요.서로 다른 프로세스의 동일한 fd가 어떻게 동일한 파일을 가리킬 수 있습니까?. 동일한 파일을 여러 번 여는 방법을 다룹니다.

관련 정보