정렬은 "sed --in-place"와 같은 파일 정렬을 지원합니까?

정렬은 "sed --in-place"와 같은 파일 정렬을 지원합니까?

--in-place나는 시각 장애인인가요, 아니면 와 같은 옵션이 없나요 sort?

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

sort출력을 입력 파일로 리디렉션

sort < f > f

결과적으로 비어 있게 됩니다. 옵션 이 없는 경우 --in-place- 이를 수행하는 몇 가지 트릭이 있을 수 있습니다.편리한방법?

(내 마음속에 떠오르는 유일한 것은:

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

이사하는 것은 올바른 선택이 아닙니다.파일 권한변경될 수 있습니다. 그래서 임시파일 내용으로 덮어쓴 뒤 삭제합니다. )

답변1

sort파일 이름을 인수로 사용하는 -o(또는  ) 옵션이 있습니다 . --output프로그램은 데이터를 임시 파일에 쓴 다음 정렬이 완료된 후 원래 입력 파일을 덮어씁니다(이는 모든 입력 데이터를 읽은 후에만 발생합니다). (이것은 본질적으로 done 과 동일합니다 sed -i.)

GNU sort정보 페이지 에서 :

    -o OUTPUT-FILE
    --output=OUTPUT-FILE
      출력 쓰기결과물 파일표준 출력 대신. 일반적으로 sort열기 전에 모든 입력을 읽습니다.결과물 파일sort -o F F 이므로 및 같은 명령을 사용하여 파일을 안전하게 정렬할 수 있습니다 cat F | sort -o F. 그러나 ( )를 sort사용하면 모든 입력을 읽기 전에 출력 파일을 열 수 있으므로 이와 같은 명령은 읽기가 완료되기 전에 쓰기가 시작될 수 있으므로 안전하지 않습니다 .--merge-mcat F | sort -m -o F - GsortFcat

      최신 시스템에서는 설정된 경우 -o입력 파일 뒤에 나타날 수 없습니다. 예를 들어 이식 가능한 스크립트는 입력 파일 앞에 지정되어야 합니다.POSIXLY_CORRECTsort F -o F-o OUTPUT-FILE

그리고로부터Open Group 기본 사양 7호:

    -o output
      표준 출력 대신 사용할 출력 파일의 이름을 지정합니다. 이 파일은 입력 파일 중 하나와 동일할 수 있습니다.
sort디스크 공간이나 디스크 할당량이 부족하거나, 출력 파일을 쓰는 동안 시스템이 충돌하거나 , 기타 오류가 발생하는 경우 sort데이터의 일부 또는 전체가 삭제(즉, 파기)될 수 있다는 보고가 있습니다 .

즉, 파일을 제자리에서 정렬하려면 다음 명령을 사용할 수 있습니다.

sort -o filename filename

답변2

당신은 그것을 사용할 수 있습니다spongestdin먼저 담근 다음 파일에 쓰는 함수입니다 . 예를 들면 다음과 같습니다.

sort < f | sponge f

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

그러나 다른 답변에서 지적했듯이 내부 수정은 sponge프로세스(예: 프로세스) 도중에 컴퓨터가 충돌하여 원본 파일과 새 파일을 모두 잃을 수 있기 때문에 일반적으로 좋은 생각이 아닙니다. 먼저 다른 파일에 쓴 다음 원자(이동) 명령을 사용하는 것이 좋습니다 mv.

답변3

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

일부 프로그램(주로 GNU 버전)에는 내부 옵션이 있습니다(예: -iPerl 및 GNU sed, -oGNU 정렬). 그들이 작업하는 방식은 데이터를 임시 파일에 넣은 다음 해당 위치로 옮기는 것입니다.

이 옵션이 없는 프로그램의 경우,콜린 왓슨의 sponge유틸리티(포함 된Joey Hess의 moreutils)는 모든 프로그램에 대해 이 작업을 자동으로 수행합니다(예:cut파일을 그 자리에서 변경할 수 있나요 ?;iconv가 입력 파일을 변환된 출력으로 바꾸도록 하려면 어떻게 해야 합니까?). 그러나 실패하더라도 do_stuff | sponge myfile비어 있거나 잘못된 출력으로 항상 덮어쓰게 됩니다. 파이프로 연결된 명령이 성공했는지 여부를 감지할 수 있는 방법이 없습니다. 따라서 임시 파일을 사용하는 것에 비해 타이핑은 편리하지만 안전하지는 않습니다.myfiledo_stuffsponge

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

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

답변4

-ovim 방식을 사용하거나 시도해 보십시오.

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

관련 정보