web-dev-qa-db-ja.com

テキストファイルのコマンドの出力で値を置き換える方法は?

以下を含むファイルがあります。

<?php return 0;

Bashで、値0を現在のタイムスタンプに置き換えます。

私は現在のタイムスタンプを次のように取得できることを知っています:

date +%s

そして、文字列をsedで置き換えることができます。

sed 's/old/new/g' input.txt > output.txt

しかし、私が望むものを達成するために2つを組み合わせる方法は? sedおよびdateを含まないソリューションも、シェルツールのみを使用している限り、歓迎されます。

22
Benjamin

通常、次の構文を使用します。

_sed "s/<expression>/$(command)/" file
_

これは_<expression>_を探し、commandの出力に置き換えます。


特定の問題については、以下を使用できます。

_sed "s/0/$(date +%s)/g" input.txt > output.txt
_

これにより、ファイルに存在する_0_がコマンド_date +%s_の出力に置き換えられます。 $()のコマンドを解釈するには、二重引用符を使用する必要があることに注意してください。それ以外の場合は、リテラル$(date +%s)を取得します。

ファイルを自動的に更新する場合は、_-i_をsedコマンドに追加します:_sed -i "s/..._。これはインプレース編集と呼ばれます。


テスト

この内容のファイルがあるとします:

_<?php return 0;
_

それが返すものを見てみましょう:

_$ sed "s/0/$(date +%s)/g" file
<?php return 1372175125;
_

置換文字列に改行とスペースが含まれている場合は、別のものを使用できます。テンプレートファイルの途中にls -lの出力を挿入しようとします。

awk 'NR==FNR {a[NR]=$0;next}
    {print}
    /Insert index here/ {for (i=1; i <= length(a); i++) { print a[i] }}'
    <(ls -l) template.file

または

sed '/^Insert after this$/r'<(ls -l) template.file
2
Walter A