리디렉션은 파일을 덮어쓰지 않고 단지 빈 파일을 생성합니다.

리디렉션은 파일을 덮어쓰지 않고 단지 빈 파일을 생성합니다.

파일만 읽고 그 안의 모든 줄을 무차별적으로 주석 처리한 다음 기존 파일을 덮어쓰는 명령이 있습니다.

cat file | sed 's/^/#/g' > file

그러나 놀랍게도 이것은 실제로 작동하지 않으며 실제로 빈 파일을 생성합니다. 파이프에 대한 내 이해에 따르면 stdout이 sed로 들어가고 sed에 의해 처리된 다음 파일로 전송된다는 점을 고려하면 이런 일이 발생해서는 안 됩니다. 그래서 왜 이런 일이 일어나는지 알고 싶습니다.

예상되는 동작을 대체하는 해결 방법을 구현했습니다.

cat file | sed 's/^/#/g' > /tmp/file; mv /tmp/file file

원래 솔루션이 작동하지 않는 이유는 무엇입니까?

답변1

리디렉션하자마자 쉘이 해당 이름의 빈 파일을 생성하기 때문에 원래 솔루션이 작동하지 않습니다. 이 문제를 해결할 -i수 있는 옵션이 있습니다 . sed예를 들어,

sed -i 's/^/#/g' file

관련 정보