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

Короткий ответ: Нет

Короткий ответ: Нет У меня есть некоторые системы аромата Ubuntu (Lubuntu и Xubuntu), которые я запускаю довольно редко. Когда я обновляю & amp; обновите их, они часто пропускают несколько версий ядра, и проблем нет. Я обычно запускаю следующие команды и получаю текущую версию ядра (из той же серии ядер),

sudo apt update
sudo apt full-upgrade

Рекомендуется запустить

sudo apt autoremove

после новое ядро ​​установлено, так что /boot имеет только два последних установленных ядра. Вы можете выбрать предыдущее ядро ​​из меню grub, если есть проблемы с новым ядром.

1
задан 22 April 2018 в 02:10

6 ответов

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

На стороне заметьте, пожалуйста, обратите внимание, что вызов system() является злым и не должен быть используется,

3
ответ дан 22 May 2018 в 11:19
  • 1
    Спасибо за ответ и предупреждение о system (). Какой из них более эффективен с точки зрения времени выполнения и памяти? 1) сначала сделать резервную копию и запустить sed- или 2) мое решение в разделе EDIT: запустить sed и удалить временный файл? – Sepideha 21 April 2018 в 22:22
  • 2
    @Sepideha Ваше решение использует 3 команды. В оболочке я бы сделал sed 's/ORANGE/orrange/g; s/APPLE/apple/g' UPPER.txt > lower.txt. Это всего лишь одна команда, один процесс и перенаправление вывода оболочки в другой файл. UPPER.txt не будет касаться. Конечно, вы можете делать резервное копирование так же просто, как копирование файла, это две команды: cp UPPER.txt UPPER.bak; sed 's/ORANGE/orrange/g; s/APPLE/apple/g' UPPER.txt > lower.txt. Но если мы избежим system(), то идеальным решением будет захват вывода из C ++ и вывод в новый файл (т. Е. Избегайте оператора shell и >). – Sergiy Kolodyazhnyy 21 April 2018 в 22:29
  • 3
    @ Сергей Колодяжный Спасибо за предложение одной команды сделать всю работу! большая помощь. Я не уверен, как избежать системы () в этом случае. Вы имеете в виду первое открытие файла UPPER.txt с использованием c ++ ifstream и после обработки текста, используя поток для записи в файле / буфере lower.txt? – Sepideha 21 April 2018 в 22:47
  • 4
    @Sepideha Да, это. Вы можете использовать popen, чтобы избежать system. См. Этот пример с запуском подпроцесса через popen и захватом вывода: stackoverflow.com/a/44611186/3701431 – Sergiy Kolodyazhnyy 22 April 2018 в 00:04
  • 5
    @PerlDuck Да, это самый умный маршрут. ОП узнает, что в конечном итоге, шаг за шагом. – Sergiy Kolodyazhnyy 22 April 2018 в 11:55

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

На стороне заметьте, пожалуйста, обратите внимание, что вызов system() является злым и не должен быть используется,

3
ответ дан 17 July 2018 в 16:26

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

На стороне заметьте, пожалуйста, обратите внимание, что вызов system() является злым и не должен быть используется,

3
ответ дан 23 July 2018 в 17:18

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

Команда 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] является исходным файлом.

2
ответ дан 22 May 2018 в 11:19
  • 1
    @ Занна, я понял. В связи с этим, в первом и втором параграфах я написал , это недоразумение . И тогда я написал , если вы хотите в качестве альтернативы. – Olimjon 21 April 2018 в 18:12

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

Команда 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] является исходным файлом.

2
ответ дан 17 July 2018 в 16:26

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

Команда 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] является исходным файлом.

2
ответ дан 23 July 2018 в 17:18
  • 1
    @ Занна, я понял. В связи с этим, в первом и втором параграфах я написал , это недоразумение . И тогда я написал , если вы хотите в качестве альтернативы. – Olimjon 21 April 2018 в 18:12

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

Похожие вопросы: