元のファイルを出力に自動的に置き換える方法は? [コピー]

元のファイルを出力に自動的に置き換える方法は? [コピー]

.scssコマンドを使用してsass()ファイルをフォーマットするWebサイトがありますsass-convert。構文は次のとおりです。

$> sass-convert original.scss formatted.scss

私はgitリポジトリにあるので、別々の出力ファイルを持つことは完全に冗長です。私の次のステップはですmv formatted.scss original.scss。 2番目のステップを避けるために何かをしたいと思います。それはまるで

$> sass-convert original.scss %^&

%^&私が望むことを行う魔法のシェル/bash構文はありますか?

bash(または他のシェル)構文を使用して、1行で出力ファイルを入力ファイルに自動的に置き換える方法はありますか?

私の問題は次のように異なります。この問題iconv出力ファイルが最初に作成され、入力ファイルが空になるため、以下にリストされている解決策のどれも機能しません。これら2つの質問に対する回答を見ると、互いに異なることがわかります。この質問に対する答えは、すぐに出力ファイルを生成しないすべてのコマンドに適用されます。

答え1

Unixプログラムには-i inplaceスイッチがあるかもしれません(たとえば、以前のバージョンsedにはありませんでしたが、ほとんどの人はからフラグを盗みますperl)。man詳しくはページをご覧ください。これは通常、プログラムが出力を一時ファイルに書き込んでから、元の名前にrename(2)新しい出力を書き込むための呼び出しを実行します(この名前を変更すると、selinuxコンテキストやプロセスの他の素晴らしいACLが破損する可能性があります。使用します)。

write-to-tmp-file-and-モードrename(2)の別の解決策はsponge次のとおりですmoreutils

$ echo hi > file
$ tr h b < file | sponge file
$ cat file
bi
$ 

答え2

バッシュを使う歴史演算子:

sass-convert original.scss !#:$

!#現在の行、:$最後の引数(これまで)を指定します。

これはうまく機能しますsass-convertが、より一般的な用途では、入力処理を終了する前に出力を切り捨てるプログラムがこのアプローチを使用できないことに注意する価値があります。

答え3

tcshまたはモードzshemacs通常はデフォルトモード)では、次のように入力できます。

sass - 生の.scss変換Ctrl+Alt+_

Ctrl+Alt+_前の単語(copy-prev-wordウィジェット)をコピーします。

前のスペースで区切られた単語をコピーし、引用符や類似の内容を理解していません(!#:$cshスタイルの履歴の拡張とは反対)。

bash他のreadlineベースのシェルでも動作する別のアプローチは、まだemacsパターンを維持しています。

sass - 生の.scss変換Ctrl+WCtrl+Y Ctrl+Y

zsh を使用すると、次の操作も実行できます。

(){sass-convert $1 $1} original.scss

(t)csh/ksh/zsh/bash の場合は中括弧拡張を使用します。

sass-convert original.scss{,}

関連情報