다음과 같은 한 줄을 사용할 때 이전 파일의 변수를 새 파일로 바꾸고 싶습니다.
cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
newFile에 결과가 있습니다.
하지만 다음과 같이 2개 이상의 행을 사용하는 경우:
cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
cat newFile | sed "s@$dayAvgInNew@$dayAvgIn@g" > newFile
cat newFile | sed "s@$dayCurInNew@$dayCurIn@g" > newFile
newFile에 결과가 없습니다. 수면을 사용해 보았지만 작동하지 않습니다. 추신. 두 번째와 세 번째 줄에서는 동일한 파일의 변수를 바꿉니다. 어떤 제안이 있으십니까?
답변1
리디렉션을 수행하면 명령이 실행되기 전에 파일이 삭제(정리)됩니다. 명령은 sponge
다음에서 비롯됩니다.더 많은 유틸리티, 파일을 쓰기 전에 파일의 표준 입력을 흡수합니다. 이렇게 하면 명령이 실행된 후 파일을 덮어쓰게 됩니다.
cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
cat newFile | sed "s@$dayAvgInNew@$dayAvgIn@g" | sponge newFile
cat newFile | sed "s@$dayCurInNew@$dayCurIn@g" | sponge newFile
moreutils가 없으면 임시 파일을 사용할 수 있습니다. 또한 사용할 필요는 없습니다 cat
.
sed "s@$dayMaxInNew@$dayMaxIn@g" < ../oldFile.html > newFile
sed "s@$dayAvgInNew@$dayAvgIn@g" < newFile | sponge newFile
sed "s@$dayCurInNew@$dayCurIn@g" < newFile | sponge newFile
마지막으로 여러 sed 명령을 하나로 결합할 수 있습니다.
sed "s@$dayMaxInNew@$dayMaxIn@g
s@$dayAvgInNew@$dayAvgIn@g
s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile
또는
sed -e "s@$dayMaxInNew@$dayMaxIn@g" \
-e "s@$dayAvgInNew@$dayAvgIn@g" \
-e "s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile
답변2
리디렉션하는 파일의 데이터를 사용하지 마십시오. 일반적으로 리디렉션으로 인해 파일을 읽을 기회가 생기기도 전에 파일이 손상됩니다. 대신 여러 명령을 사용해 보세요 sed
.
sed "command1;command2;command3" < ../oldfile.html > newFile