쉘 스크립트에서 다중 쓰기 파일 및 sed를 사용할 때 결과가 없습니다.

쉘 스크립트에서 다중 쓰기 파일 및 sed를 사용할 때 결과가 없습니다.

이와 같은 한 줄을 사용할 때 이전 파일의 변수를 새 파일로 바꾸고 싶습니다.

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

관련 정보