나는 장님 입니까 또는 같은 옵션 --in-place
이 sort
없습니까?
입력 파일에 결과를 저장하기 위해 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 버전)에는 적절한 옵션이 있습니다 (예 : -i
perl 및 GNU sed; -o
GNU 정렬). 데이터를 임시 파일에 넣은 다음 제자리로 이동하여 작동합니다. 그러한 옵션이없는 프로그램의 경우, Colin Watson sponge
유틸리티 ( Joy Hess의 moreutils에 포함 )는 모든 프로그램에 대해 안전하게 작업을 수행합니다 (예 : 파일을 제자리에서 변경할 수 있습니까 cut
? ; iconv를 입력 파일을 변환 된 파일로 바꾸려면 어떻게 해야합니까? 출력? ).
동일한 권한으로 원본 파일을 다시 만들 수없는 드문 경우에만 파일을 덮어 쓰는 것이 좋습니다. 이 경우 원래 입력을 어딘가에 저장하는 것이 좋습니다. 그런 다음 간단히 입력 사본을 처리하여 원본 파일로 보낼 수 있습니다.
cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional
답변
-o
vim-way를 사용 하거나 시도하십시오 :
$ ex -s +'%!sort' -cxa file.txt