Как предотвратить, чтобы команда sed перезаписывала исходный файл и выводила новый файл?

В UPPER.txt файл, мне нужно заменить APPLE а также ORANGE с некапитальной apple а также orange, Мне также нужно сохранить старый файл UPPER.txt как это было, и создать новый файл lower.txt, Я использую следующие команды:

sed 's/APPLE/apple/g' UPPER.txt > lower.txt
sed 's/ORANGE/orange/g' UPPER.txt > lower.txt

Но проблема в том, что после запуска вышеуказанной команды UPPER.txt а также lower.txt стать таким же, содержащим некапитальные предметы. Я хочу UPPER.txt остаться, как было изначально.

Как сохранить резервную копию исходного файла после использования sed? Поскольку я хочу использовать эту команду в C++, используя system(command) для работы с файлами я бы хотел, чтобы все команды были записаны в одну строку, а затем я мог бы передать ее как строку системной команде.

2 ответа

Решение

Упомянутая вами команда sed 's/APPLE/apple/g' UPPER.txt > lower.txt не следует перезаписывать оригинал UPPER.txt, так как sedповедение по умолчанию для записи lower.txt, Вы сделали что-то еще, что могло перезаписать исходный файл. sed не трогать оригинальный файл, если вы не предоставите -i флаг. Для ваших целей я бы предложил сначала сделать резервную копию исходного файла, иначе просто скопируйте его.

Обратите внимание на то, что system() звонок - это своего рода зло, и его нельзя использовать,

Я думаю, что у вас есть некоторые недоразумения.

sed Команда выводит результат только в bash. Это не имеет ничего общего с оригинальным файлом. > Оператор только записывает результат в файл.

Однако, если вы хотите, есть вариант -i который может редактировать оригинальный файл. С -i опция поставляется с резервным суффиксом (необязательно).

$ cat UPPERCASE.txt 
APPLE
$ sed 's/APPLE/apple/g' UPPERCASE.txt
apple
$ sed 's/APPLE/apple/g' UPPERCASE.txt > lowercase.txt
$ cat UPPERCASE.txt 
APPLE
$ cat lowercase.txt 
apple
$ sed 's/APPLE/apple/g' -i[BACKUP] UPPERCASE.txt 
$ cat UPPERCASE.txt 
apple
$ ls
UPPERCASE.txt UPPERCASE.txt[BACKUP] lowercase.txt

Здесь [BACKUP] файл является исходным файлом.

Другие вопросы по тегам