Стандартный вывод в файл, из которого читается контент - PullRequest
1 голос
/ 11 марта 2012

Когда я хочу изменить файлы с помощью Bash, я обычно перенаправляю стандартный вывод в другой файл, а затем удаляю оригинал. Есть ли более быстрый способ?

Например:

cut -d':' -f2 FILE > FILE

Это делает мой исходный файл пустым (он очищает файл перед записью, а затем начинает читать)

Все, что я могу сделать, это:

cut -d':' -f2 FILE > FILE2
rm -f FILE
mv FILE2 FILE

Есть ли способ перенаправить (измененный) вывод в исходный файл всего за один шаг?

Ответы [ 3 ]

0 голосов
/ 11 марта 2012

Боюсь, в bash нет удобного общего способа сделать это.Проблема в том, что перед выполнением каких-либо команд bash открывает FILE для вывода, обрезая его, поэтому, когда cat открывает файл, все, что он видит, - это новый пустой файл.sed имеет опцию -i для выполнения внутренней замены (для которой он фактически использует временный файл), zsh имеет =(...), как упоминалось в других ответах, и sort вручную проверяет, является ли ввод ивыходные файлы совпадают (при использовании -o, как я уже говорил, при использовании перенаправления оболочки файл будет стерт до того, как программа его увидит), но cut и многие другие утилиты этого не делают.Вы должны использовать временный файл для тех.

0 голосов
/ 11 марта 2012

Если вы установите утилиту sponge Колина Уотсона (ссылка на блог Колина устарела, но вы можете получить ее как часть пакета moreutils Джои Хесса )Вы можете использовать его, чтобы «впитать» вывод перед тем, как сбросить его обратно в файл:

cat FILE | cut -d':' -f2 | sponge FILE
0 голосов
/ 11 марта 2012

Боюсь, у меня нет ответа для вас в bash, но в zsh это очень просто:

cut -d':' -f2 =(cat FILE) > FILE

Конструкция =(...) создает временный файл, содержащий выходные данные программыупомянутый, который удаляется после того, как команда, содержащая это, закончена.

...