sort는`sed –in-place`와 같이 제자리에서 파일 정렬을 지원합니까? 사용합니다 . 출력을 sort입력 파일로

나는 장님 입니까 또는 같은 옵션 --in-placesort없습니까?

입력 파일에 결과를 저장하기 위해 sed는 -i( --in-place)를 사용합니다 .

출력을 sort입력 파일로 경로 재 지정

sort < f > f

비워집니다. --in-place옵션 이없는 경우 – 편리한 방법 으로이 작업을 수행하는 방법이 있습니까?

(내 마음에 온 유일한 것은 :

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

이동이 올바른 선택이 아니기 때문에 파일 권한 이 변경 될 수 있습니다. 그렇기 때문에 임시 파일의 내용으로 덮어 쓴 다음 제거합니다.)



답변

sort-o, --output파일 이름을 인수로 사용 하는 옵션이 있습니다. 입력 파일과 동일하면 결과를 임시 파일에 기록한 다음 원래 입력 파일을 덮어 씁니다 (정확히 수행하는 것과 동일 함 sed -i).

에서 GNU sort정보 페이지 :

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

그리고 Open Group Base Specification Issue 7 :

-o  output
    Specify the name of an output file to be used instead of the standard
    output. This file can be the same as one of the input files.


답변

sponge함수 를 사용할 수 있습니다.이 함수는 먼저 stdin다음을 담그고 파일에 씁니다.

sort < f | sponge f

단점은 sponge출력을 메모리에 임시로 저장하므로 큰 파일에는 문제가 될 수 있다는 것입니다. 그렇지 않으면 먼저 파일에 파일을 쓴 다음 원본 파일을 덮어 써야합니다.

그러나 다른 답변에서 지적했듯이 프로세스 중간 (예 : 프로세스 sponge) 중에 시스템이 중단되어 원본 파일과 새 파일을 모두 잃을 수 있기 때문에 수정은 일반적으로 좋은 생각이 아닙니다 . 먼저 다른 파일에 작성한 다음 원자 mv(이동) 명령 을 사용하는 것이 좋습니다 .


답변

입력 파일을 출력 파일로 덮어 쓰는 것은 위험합니다. 파일을 쓰는 동안 프로그램이나 시스템이 충돌하면 둘 다 손실 되었기 때문입니다.

일부 프로그램 (대부분 GNU 버전)에는 적절한 옵션이 있습니다 (예 : -iperl 및 GNU sed; -oGNU 정렬). 데이터를 임시 파일에 넣은 다음 제자리로 이동하여 작동합니다. 그러한 옵션이없는 프로그램의 경우, Colin Watson sponge유틸리티 ( Joy Hess의 moreutils에 포함 )는 모든 프로그램에 대해 안전하게 작업을 수행합니다 (예 : 파일을 제자리에서 변경할 수 있습니까 cut? ; iconv를 입력 파일을 변환 된 파일로 바꾸려면 어떻게 해야합니까? 출력? ).

동일한 권한으로 원본 파일을 다시 만들 수없는 드문 경우에만 파일을 덮어 쓰는 것이 좋습니다. 이 경우 원래 입력을 어딘가에 저장하는 것이 좋습니다. 그런 다음 간단히 입력 사본을 처리하여 원본 파일로 보낼 수 있습니다.

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional


답변

-ovim-way를 사용 하거나 시도하십시오 :

$ ex -s +'%!sort' -cxa file.txt


답변