man
Страница не дает мне большие надежды, но я надеюсь , что это документирован (и / или GNU-специфических) функция.
man
Страница не дает мне большие надежды, но я надеюсь , что это документирован (и / или GNU-специфических) функция.
Ответы:
Ты не можешь Либо используйте ed или GNU sed или perl, либо делайте то, что они делают за кулисами, то есть для создания нового файла для содержимого.
ed
портативный:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
GNU sed
:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
Perl:
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
, создание нового файла (рекомендуется, потому что если ваш скрипт прерван, вы можете просто запустить его снова):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
, заменив файл на месте (сохраняет право собственности и права доступа foo
, но нуждается в защите от прерываний):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
Я рекомендую использовать один из cut
методов на основе. Таким образом, вы не зависите от какого-либо нестандартного инструмента, вы можете использовать лучший инструмент для работы и контролировать поведение при прерывании.
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
. И вам не следует звонить rm foo
, потому что mv foo.new foo
это атомарно: оно удаляет старую версию и одновременно устанавливает новую версию на место.
В пакете moreutils из ubuntu (а также из Debian ) есть программа sponge
, которая также решает вашу проблему.
От мужского губка:
Губка читает стандартный ввод и записывает его в указанный файл. В отличие от перенаправления оболочки, губка впитывает весь свой ввод перед открытием выходного файла. Это позволяет сжимать конвейеры, которые читают и записывают в один и тот же файл.
Что позволит вам сделать что-то вроде:
cut -d <delim> -f <fields> somefile | sponge somefile
Я не думаю, что это возможно, используя в cut
одиночку. Я не мог найти это на странице человека или информации. Вы можете сделать что-то такое, как
mytemp=$(mktemp) && cut -d" " -f1 file > $mytemp && mv $mytemp file
mktemp
делает вас относительно безопасным временным файлом, в который вы можете перенаправить cut
вывод.
Вы можете использовать slurp с POSIX Awk:
cut -b1 file | awk 'BEGIN{RS="";getline<"-";print>ARGV[1]}' file
Ну, поскольку cut
выдает меньше информации, чем читает, вы можете сделать:
cut -c1 < file 1<> file
То есть, сделать его стандартный file
вывод file
открытым в режиме только для чтения, а стандартный вывод - открытым в режиме чтения + записи без усечения ( <>
).
Таким образом, cut
файл будет перезаписан поверх самого себя. Тем не менее, оставшаяся часть файла останется нетронутой. Например, если file
содержит:
foo
bar
На выходе получится:
f
b
bar
f\nb\n
Заменили foo\n
, но bar
все же есть. Вам нужно будет обрезать файл послеcut
завершения.
С помощью 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
Помните, что со всеми методами, которые включают фактическую перезапись на месте, если операция прерывается на полпути, вы получите поврежденный файл. Использование временного второго файла позволяет избежать этой проблемы.
.old
метод для изменений на месте,echo "$(cut -d , -f 1,3 <foo)" > foo