LINUX.ORG.RU

shell: изменить файл in place


0

0

Хочу выполнять некоторые операции над файлами in place при помощи пайпов.

Допустим, у sed есть соответствующий ключик, а что делать в той ситуации, когда ключа нет?

Записать в другой файл, а потом выполнить mv? Или есть более простой способ?
Перемещено Dimez из Talks

★★★★

Блин; опять разделом промахнулся :( Перенесите, пожалуйста.

Davidov ★★★★
() автор топика

> Записать в другой файл, а потом выполнить mv? Или есть более простой способ?

Другой-файл-потом-mv — это самое надежное, у тебя получается примитивный, но механизм транзакций в виде бонуса.

shimon ★★★★★
()
Ответ на: комментарий от shimon

Иногда готов им пожертвовать в пользу удобства :)

Davidov ★★★★
() автор топика

> Хочу выполнять некоторые операции над файлами in place при помощи пайпов.

Именно пайпов? не получится, ИМХО. Ну или приведи пример того, чего хочешь.

> Допустим, у sed есть соответствующий ключик

Сильно подозреваю, что он сводится к автоматизации "другой-файл-потом-mv", потому что весь промежуточный результат всё равно нужно хранить.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Ну или приведи пример того, чего хочешь.

sort list > list

>Сильно подозреваю, что он сводится к автоматизации

Мне бы хватило и автоматизации, но чтобы это было от меня скрыто.

Davidov ★★★★
() автор топика

Мне почему-то кажется, что в Plan 9 это можно
обычным перенаправлением вывода делать.
Не могу нагуглить сейчас.

Sphinx ★★☆☆
()
Ответ на: комментарий от NekoExMachina

>sort list|sponge list

О! Супер, спасибо. То, что нужно.

Davidov ★★★★
() автор топика

"Unlike a shell redirect, sponge soaks up all its input before opening the output file" - ты уверен, что именно это тебе надо? Она рухнет на файле больше 2-3 гигабайт, и не заметит ошибки на другой стороне конвейера.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Она рухнет на файле больше 2-3 гигабайт

Не факт. По хорошему её нужно переписать так, чтобы она делала это в temporary файл, а потом переименовывала (с созданием бэкапа). Вот это было бы круто.

>и не заметит ошибки на другой стороне конвейера.

Я такие вещи делаю только на простых конвейерах, и сначала на stdout проверяю.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

>> Она рухнет на файле больше 2-3 гигабайт

> Не факт.

А ты попробуй :)

>>и не заметит ошибки на другой стороне конвейера.

>Я такие вещи делаю только на простых конвейерах, и сначала на stdout проверяю.

ммм... причем тут сложность конвейера и что такое "проверка на stdout"?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>ммм... причем тут сложность конвейера

Почти нет шанса необратимо убить данные (из-за того, что неправильно написал какую-то опцию).

>что такое "проверка на stdout"?

Ну я имел в виду, что сначала нужно посмотреть глазами head и tail, проверить wc -l. Только потом использовать sponge.

Davidov ★★★★
() автор топика
Ответ на: комментарий от Davidov

Не вижу никаких противоречий, автоматизируй, используя временные файлы.

Lumi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.