Нет результата при использовании Multiple write file и sed в скрипте оболочки

Нет результата при использовании Multiple write file и 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. Я пытаюсь использовать sleep, но это не работает. P.S. Во 2-й и 3-й строке я меняю местами переменные в samefile. Есть какие-нибудь советы?

решение1

Перенаправление затирает (очищает) файл перед запуском команды. Команда spongeизmoreutils, поглощает свой стандартный ввод перед записью в файл. Таким образом, файл перезаписывается после выполнения команды.

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

Связанный контент