Как я могу удалить файл с именем «--append»? [дубликат]

Итак, поскольку cut производит меньше вывода, чем читает, вы можете сделать:

cut -c1 < file 1<> file

То есть сделать его стандартный ввод, файл открытым в режиме только для чтения, а его стандартный вывод файл открыт в режиме чтения + записи без усечения ( <> ).

Таким образом, cut просто перезапишет файл поверх себя. Однако остальная часть файла останется нетронутой. Например, если файл содержит:

foo
bar

Результатом будет:

f
b
bar

f \ nb \ n заменили foo \ n , но бар все еще там. Вам нужно будет обрезать файл после завершения вырезания .

Используя ksh93 , вы можете сделать это с помощью его оператора <>; , который действует как <> , за исключением того, что если команда завершится успешно, ftruncate () вызывается в файловом дескрипторе. Итак:

cut -c1 < file 1<>; file

С другими оболочками вам нужно будет выполнить ftruncate () с помощью других средств, например:

{ cut -c1 < file; perl -e 'truncate STDOUT, tell STDOUT';} 1<> file

, хотя вызов perl только для этого будет немного излишним. здесь, особенно с учетом того, что perl может легко выполнить эту работу cut , например:

perl -pi -e '$_ = substr($_, 0, 1)' file

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

6
17.08.2015, 23:09
0 ответов

Теги

Похожие вопросы