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