programing

bash를 사용하여 파일(인수)을 "in place"로 편집하는 명령을 실행하려면 어떻게 해야 합니까?

javamemo 2023. 4. 20. 19:39
반응형

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 Fsort--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

반응형