回答:
できません。edまたはGNU sedまたはperlを使用するか、コンテンツの新しいファイルを作成するためにバックグラウンドで実行します。
ed、ポータブル:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOFGNU sed:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' fooPerl:
perl -i -l -F, -pae 'print @F[1,3]' foocut、新しいファイルを作成します(スクリプトが中断された場合、再度実行できるため、推奨されます):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foocut、ファイルを所定の場所に置き換えます(の所有権とアクセス許可は保持されますが、foo中断に対する保護が必要です):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.oldcutベースの方法のいずれかを使用することをお勧めします。そうすれば、非標準ツールに依存せず、ジョブに最適なツールを使用でき、割り込み時の動作を制御できます。
cut -d , -f 1,3 foo > foo.new rm foo  mv foo.new foo
                    rm foo。アトミックrm fooであるため、呼び出すべきではありません。mv foo.new foo古いバージョンを削除し、同時に新しいバージョンを配置します。
                    まあ、それcutはそれが読むよりも少ない出力を生成するので、あなたがすることができます:
cut -c1 < file 1<> fileつまり、stdin fileを読み取り専用モードでfile開き、stdout を切り捨てなしで読み取り+書き込みモードで開きます(<>)。
そう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実際のインプレース書き換えを含むすべての方法で、操作が途中で中断されると、ファイルが破損することに注意してください。一時的な2番目のファイルを使用すると、この問題を回避できます。
.oldインプレース変更の方法よりも優れていますecho "$(cut -d , -f 1,3 <foo)" > foo