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