Я просто сбежал
cat /opt/webapplications/Word/readme.log | grep -v 'Apple'
и я получил вывод на cli, который я ожидал, это были все строки в readme.log
что не содержало 'Apple
'...
Далее я побежал ...
cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log
Тем не мение, /opt/webapplications/Word/readme.log
пусто.
Может ли кто-нибудь объяснить мне, почему это произошло, или как я должен был поступить правильно?
Это произошло потому, что первым делом >
делает, чтобы создать файл, в который он хочет записать - и если файл уже существует, его содержимое будет удалено. (Кроме того, нет необходимости использовать cat
в вашем заявлении с grep
работает с файлами, а не только с STDIN.)
Правильный способ сделать это - использовать временный файл для чтения или записи. Так что либо
cp /opt/webapplications/Word/readme.log /tmp/readme.log
grep -v 'Apple' /tmp/readme.log > /opt/webapplications/Word/readme.log
или
grep -v 'Apple' /opt/webapplications/Word/readme.log > /tmp/readme.log
mv /tmp/readme.log /opt/webapplications/Word/readme.log
должно сработать.
При перенаправлении в тот же файл (>
), оболочка может создать / обрезать файл до cat
вызывается команда и считывается ввод (см .: Почему не работает «сортировать файл1> файл1»?). Если вы хотите отфильтровать файл, лучше перенаправить вывод в другой файл или вообще избегать перенаправления, например:
grep -v 'Apple' readme.log | tee readme.log
Лучше и безопаснее использовать локальные редакторы, предназначенные для такого рода операций, например
sed -i '.bak' '/Apple/d' readme.log
или используйте ex
(часть Vim):
ex +g/Apple/d -cwq readme.log
Связанный: