tr stdout을 파일 [중복]으로 리디렉션

tr stdout을 파일 [중복]으로 리디렉션

중복 가능성:
iconv가 입력 파일을 변환된 출력으로 바꾸도록 하려면 어떻게 해야 합니까?
덮어쓰지 않고 Linux에서 동일한 파일을 읽고 쓸 수 있습니까?

$ cat test.txt 
This is a test file.
$ tr 'a' 'z' < test.txt 
This is z test file.
$ tr 'a' 'z' < test.txt > test.txt
$ cat test.txt
$ 

tr이 test.txt에 아무 것도 출력하지 않는 것 같은 이유는 무엇입니까? 내가 찾은이 스레드, 그러나 무슨 일이 일어나고 있는지, 그리고 문제를 해결하는 방법을 잘 이해하지 못합니다.

(그리고 제가 sed를 사용하지 않는 이유는 줄바꿈 문자를 다른 문자로 바꾸고 싶기 때문인데, sed가 한 줄 단위로 동작할 수는 없을 것 같은데요?)

답변1

문제는 동일한 파일에서 동시에 읽고 쓰는 것입니다.

쉘은 먼저 빈 파일을 생성하는(즉, 파일을 자르는) 출력 리디렉션을 설정합니다. 그런 다음 입력 리디렉션을 설정하고 tr빈 파일에서 읽습니다.

다음과 같은 임시 파일을 사용하여 문제를 해결할 수 있습니다.

$ tr 'a' 'z' < test.txt > temp.txt && mv temp.txt test.txt

답변2

한 파일에서 다른 파일로 동시에 리디렉션할 수는 없습니다. 적어도 그런 경우는 아닙니다. 문제는 쉘이 리디렉션을 부분적으로 설정하면 파일이 잘린다는 것입니다. 그래서 tr은 파일에서 읽으려고 시도하지만 비어 있습니다.

배포판에 이 문제를 해결하는 프로그램이 moreutils포함된 패키지가 있다면 작동할 것입니다.spongetr 'a' 'z' < test.txt | sponge test.txt

그렇지 않으면 출력을 임시 파일에 쓴 다음 이를 사용하여 mv원본 파일을 덮어써야 합니다.

관련 정보