sed -iのようにファイルに「expand」コマンドをその場で適用します。

sed -iのようにファイルに「expand」コマンドをその場で適用します。

このexpandコマンドには同等のコマンドはありません

sed -i <file>

expand実際には選択肢はある-iが、それは

空白の後のみ

同じ目的を達成するためのダイナミックなデュオの組み合わせsedはありますか?expand

答え1

GNU ユーティリティ expand は、sed のような「インプレース」更新を提供しません。コマンドが少し長くなるかもしれませんが、同じ結果を再現するのはかなり簡単です。

破損のリスクなしに、任意のファイル システムでファイルを解析して同時に更新することは不可能であり、そのため、および他の理由から、sed はユーザーから抽象化はしているものの、実際にはそれを行いません。sed が行うことは、オブジェクト ファイルに対する操作の出力を一時ファイルに保存し、元のコピーを削除して、一時ファイルを元のコピーと同じ名前に変更することであり、これは自分で再現できます。

これを行う方法は数多くありますが、その 1 つとして、orig.txt という名前のファイルが「展開」されるファイルです。

tmp=`mktemp` && expand orig.txt > "$tmp" && mv "$tmp" orig.txt

ファイル名以外の引数を拡張に使用しない場合は、という名前の単純な関数でexpand一時ファイル全体を元のファイルスワップに隠し、sed動作を再現できます。この実装では、パス/ファイル名の単一の引数を取ります。

expand() {
  [[ "$#" -ne "1" ]] && { echo "A single argument must be provided"; exit 1; }
  tmp=`mktemp` && expand "$1" > "$tmp" && mv "$tmp" "$1"
}

少し変更するだけで、expand引数をサポートすることですべての機能を再現できます。最後の引数を取得するにはちょっとしたコツがあります。これにより、オブジェクト ファイルのファイル名がわかり、最終的に の出力で上書きできるようになりますexpand。最後の引数は として参照されます${@ -1}

expand() {
      [[ "$#" -lt "1" ]] && { echo "At least a file name argument must be provided"; exit 1; }
      # Here we capture the last argument which is the object file name
      fname="${@: -1}"
      # The upcoming call to expand passes on all arguments including the file name
      tmp=`mktemp` && expand "$@" > "$tmp" && mv "$tmp" "$fname"
    }

このコードはテストしていないので、気づかなかった構文エラーがあった場合はお詫び申し上げます。

.bashrcこれらの関数の 1 つ、またはそのバージョンは、新しいシェルを作成するときにソースとなる または同等のファイルに配置して、すぐに使用できるようにします。

ファイルを「その場で」更新するか、更新内容を stdout に送信するかを指定できるようにしたい場合は、この関数テンプレートを変更して、追加の引数 (expand に渡されるのではなく、expand の呼び出し方法を変更する) に基づいて指定することができます。それを探しているのかどうかはわかりませんが、探しているのであれば、必要な情報はすべて揃っていると思います。

もっと楽しみたい方は、GNU coreutilsをダウンロードしてください。ソースコードそしてそのsed ソースコードsed がどのように処理するかを確認し、そのコードを新しい改善された expand バージョンに移行します。その変更をメンテナーに送り返すと、将来のすべての 'expand' ユーザーにとってこれが簡素化される可能性があります。

関連情報