Если я перенаправляю вывод команды в тот же файл, это читает из, его содержание стирается.
sed 's/abd/def/g' a.txt > a.txt
Кто-либо может объяснить почему?
Первое, что делает перенаправление, - открывает файл для записи, таким образом очищая все существующее содержимое. Затем sed пытается прочитать этот пустой файл, который вы только что создали, и ничего не делает. Затем файл закрывается и ничего не содержит.
Для редактирования файла на месте необходимо использовать параметр -i
:
sed -i .bck 's / abd / def / g' a. txt
РЕДАКТИРОВАТЬ: как заметил Нил, перенаправление сначала открывает файл для записи, таким образом, очищает его.
РЕДАКТИРОВАТЬ2: это может быть интересно для некоторых читателей
В OSX, если вы хотите использовать - i
с пустым расширением, чтобы предотвратить создание файла резервной копии, вам также необходимо использовать переключатель -e
, иначе он не сможет правильно проанализировать аргументы:
sed -i -e 's / abc / def / g' a.txt
Операции перенаправления <
, >
и т. Д. Обрабатываются оболочкой. Когда вы даете команду оболочке, которая включает перенаправление, оболочка сначала откроет файл. В случае >
файл будет открыт для записи, что означает, что он будет обрезан до нулевого размера. После того, как файлы перенаправления были открыты, оболочка запускает новый процесс, привязывая свой стандартный ввод, вывод и ошибку к любым возможным перенаправленным файлам, и только затем выполняет указанную вами команду. Поэтому, когда команда sed
в вашем примере начинает выполнение, a.txt
уже усечен оболочкой.
Между прочим, и несколько косвенно,