почему sed replace + redirection удаляет мой файл? - PullRequest
4 голосов
/ 27 марта 2012

Я использую sed для поиска и замены двух строк в файле в bash (GNU sed)

Это файл после

-rw-r--r-- 1 websync www-data 4156 mar 27 12:56 /home/websync/tmp/sitio-oficial/sitios/wp-config.php

вот команда, которую я запускаю

sed 's/www-test/www/g' /home/websync/tmp/sitio-oficial/sitios/wp-config.php > /home/websync/tmp/sitio-oficial/sitios/wp-config.php

и результат

-rw-r--r-- 1 websync www-data 0 mar 27 13:05 /home/websync/tmp/sitio-oficial/sitios/wp-config.php

РЕДАКТИРОВАТЬ: Если я не перенаправить вывод sed, то я получил правильный вывод. Если я перенаправлю на новый файл, все работает нормально.

Ответы [ 3 ]

15 голосов
/ 27 марта 2012

Это нормально. вы не можете читать и писать в один и тот же файл в конвейере, как это. (это не удастся с другими утилитами, кроме sed).

Используйте вместо него флаг -i:

sed -i 's/www-test/www/g' /home/websync/tmp/sitio-oficial/sitios/wp-config.php
4 голосов
/ 27 марта 2012

sed читает ваши файлы в виде потока и выводит также поток. Как только вы выполняете перенаправление в файл, его содержимое перезаписывается, и поскольку этот файл читается как поток, он еще даже не начал читать с помощью sed. Когда sed начинает чтение файла, он пуст, поэтому сразу завершает работу без вывода.

Используйте -i, чтобы выполнить редактирование на месте:

sed 's/www-test/www/g' -i /home/websync/tmp/sitio-oficial/sitios/wp-config.php
2 голосов
/ 27 марта 2012

Перенаправление открывает файл для вывода, обрезая его. Это происходит одновременно с sed открытием его для чтения, поэтому sed видит усеченную версию. Вам следует перенаправить вывод в другой файл, чтобы избежать путаницы при вводе, или использовать режим редактирования на месте sed вместо перенаправления:

sed 's/www-test/www/g' -i /home/websync/tmp/sitio-oficial/sitios/wp-config.php

...