bash를 사용하여 파일(인수)을 "in place"로 편집하는 명령을 실행하려면 어떻게 해야 합니까?
txt로 txt, 를도온 with with tttt ttt ttt t,,,. 。sort
쾅쾅거리다
원본 파일을 대체하기 위해 정렬된 결과를 원합니다.
이것은 동작하지 않습니다(빈 파일이 표시됩니다).
sortx temp.txt > temp.txt
임시 파일에 복사하지 않고 한 줄로 작업을 수행할 수 있습니까?
집:-o
에게 있어서 옵션은 매우 바람직하다sort
나는 사용했다.sort
예를 들어 질문합니다.다른 명령에서도 같은 문제가 발생합니다.
uniq temp.txt > temp.txt.
더 나은 일반적인 해결책이 있을까요?
sort temp.txt -o temp.txt
A sort
는 출력을 시작하기 전에 모든 입력을 확인해야 합니다. 「 」는,sort
프로그램을 사용하면 파일을 바로 변경할 수 있습니다.
sort temp.txt -o temp.txt
특히 GNU 문서에는 다음과 같이 기술되어 있습니다.
을 열기 에 모든 에 sort를 하여 파일을 안전하게 할 수 .
sort -o F F
★★★★★★★★★★★★★★★★★」cat F | sort -o F
sort
--merge
)-m
)는을 열 수 있기 에, 같은 합니다.따라서 명령어는 다음과 같습니다.cat F | sort -m -o F - G
.F
전에cat
뭇매를 맞다
BSD sort
라고 말합니다
[ output - file ]가 입력 파일 중 하나일 경우, sort는 출력을 정렬하여 [output - file]에 쓰기 전에 해당 파일을 임시 파일로 복사합니다.
as as commands uniq
는 입력 읽기를 완료하기 전에 출력 쓰기를 시작할 수 있습니다.일반적으로 이러한 명령어는 인플레이스 편집을 지원하지 않습니다(또한 이러한 명령어는 이 기능을 지원하기가 더 어렵습니다).
일반적으로 임시 파일을 사용하여 작업을 수행하거나 중간 파일이 없는 경우 버퍼를 사용하여 완전한 결과를 저장한 후 쓸 수 있습니다.를 들어, 「」를 ,perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
는 perl의 을 perl의 perl의 perl의 perl의 perl의 perl의 perl을 .uniq
$_
원본 파일을 이 데이터로 덮어씁니다.선택한 스크립트 언어(아마 Bash에서도)에서도 같은 작업을 수행할 수 있습니다.그러나 파일 전체를 저장하는 데 충분한 메모리가 필요하므로 대용량 파일을 사용하는 경우에는 권장하지 않습니다.
다음은 uniq, sort 등과 연계한 보다 일반적인 접근법입니다.
{ rm file && uniq > file; } < file
스펀지에 대한 토부의 코멘트는 그 자체로 답이 될 수 있다.
moreutils 홈페이지에서 인용하려면:
지금까지 moreutils에서 가장 일반적인 목적의 도구는 다음과 같은 작업을 수행할 수 있는 스폰지(1)입니다.
% sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
하지만,sponge
스티브 제섭이 말한 것과 같은 문제를 겪고 있습니다.이전 파이프라인에서 명령어 중 하나가sponge
실패하면 원본 파일이 덮어쓰게 됩니다.
$ mistyped_command my-important-file | sponge my-important-file
mistyped-command: command not found
어허.my-important-file
없어졌어요.
여기 있습니다. 한 줄:
sort temp.txt > temp.txt.sort && mv temp.txt.sort temp.txt
기술적으로는 임시 파일에 복사할 필요가 없으며, 'mv' 명령어는 즉시 사용할 수 있어야 합니다.
마음에 들어요.sort file -o file
응답하지만 동일한 파일 이름을 두 번 입력하지는 않습니다.
BASH 이력 확장 사용:
$ sort file -o !#^
를 누르면 현재 행의 첫 번째 arg가 잡힙니다.
고유한 정렬 위치:
$ sort -u -o file !#$
현재 줄의 마지막 arg를 잡습니다.
많은 분들이 -o 옵션을 언급하고 있습니다.여기 man page 부분이 있습니다.
man 페이지부터:
-o output-file
Write output to output-file instead of to the standard output.
If output-file is one of the input files, sort copies it to a
temporary file before sorting and writing the output to output-
file.
이것은 메모리 제약이 심하지만 awk를 사용하여 중간 데이터를 메모리에 저장하고 다시 쓸 수 있습니다.
uniq temp.txt | awk '{line[i++] = $0}END{for(j=0;j<i;j++){print line[j]}}' > temp.txt
대체 수단sponge
더 일반적이면sed
:
sed -ni r<(command file) file
모든 명령어로 동작합니다(sort
,uniq
,tac
, ...) 및 매우 잘 알려진 를 사용합니다.sed
의 옵션(파일을 일괄 편집).
경고:해라command file
첫째, 파일 내부 편집은 본질적으로 안전하지 않기 때문입니다.
설명.
첫째, 당신이 말하고 있는 것은sed
(오리지널)-n
행(옵션)을 인쇄하지 않도록 합니다.또,sed
의 명령어 및bash
의 프로세스 대체, 생성된 콘텐츠<(command file)
출력은 제자리에 저장됩니다.
더 쉽게 할 수 있는
이 솔루션을 함수로 정리할 수 있습니다.
ip_cmd() { # in place command
CMD=${1:?You must specify a command}
FILE=${2:?You must specify a file}
sed -ni r<("$CMD" "$FILE") "$FILE"
}
예
$ cat file
d
b
c
b
a
$ ip_cmd sort file
$ cat file
a
b
b
c
d
$ ip_cmd uniq file
$ cat file
a
b
c
d
$ ip_cmd tac file
$ cat file
d
c
b
a
$ ip_cmd
bash: 1: You must specify a command
$ ip_cmd uniq
bash: 2: You must specify a file
인터랙티브하지 않은 에디터로 읽어주세요.
인수를 사용합니다.--output=
★★★★★★★★★★★★★★★★★」-o
방금 FreeB에서 시도했습니다.SD:
sort temp.txt -otemp.txt
「 」를 uniq
의입니까?
sort inputfile | uniq | sort -o inputfile
sort
- 파일은 하지 않습니다.sort
을 사용하다을 사용한 다른가 파일 에 맞도록 충분히 것을 한 합니다. stdin은 stdin입니다.
편집: 부끄럽습니다. sort temp.txt -o temp.txt
동작은 훌륭합니다.
또 다른 솔루션:
uniq file 1<> file
언급URL : https://stackoverflow.com/questions/146435/how-do-i-execute-any-command-editing-its-file-argument-in-place-using-bash
'programing' 카테고리의 다른 글
용기 바닥에 div를 배치하려면 어떻게 해야 합니까? (0) | 2023.04.20 |
---|---|
Swift 기반 애플리케이션은 OS X 10.9/iOS 7 이하에서 작동합니까? (0) | 2023.04.20 |
Qt 5.1.1: 플랫폼 플러그인 "windows"가 없어 응용 프로그램을 시작하지 못했습니다. (0) | 2023.04.20 |
TPM(Trusted Platform Module)을 사용하여 바이트를 암호화하는 방법 (0) | 2023.04.20 |
플레인 ADO를 사용하여 SQL Server에서 뷰 정의를 가져오는 방법이 있습니까? (0) | 2023.04.20 |