Bashスクリプトを使用して、現在の日付を.cfg / textファイルに書き込みます。

Bashスクリプトを使用して、現在の日付を.cfg / textファイルに書き込みます。

現在の日付を月/日(例:6/18)として.cfgファイルに印刷しようとしています(特定の行を変更する必要があるため、sedを使用しています)。ただし、bashを実行すると出力の日付は正確ですが、ファイルをチェックすると日付の代わりにコマンドが印刷されます。どんな提案がありますか?

sed -i -- 's/^example=.*/example="$(date)"/g' /path/to/config.cfg

また、日付は日付全体(2020年6月18日木曜日19:34:14 EDT)のみを印刷します。月/日付だけが欲しいです。

よろしくお願いします! ! !

ベストアンサー1

シェルは、一重引用符で囲まれた文字列内の何も拡張しません。

sed式には二重引用符で囲まれた文字列を使用する必要があります。

sed -i "s,^\(example=\).*,\1$(date +%m/%d)," /path/to/config.cfg

または、2つの一重引用符文字列を使用し、それらの間に二重引用符でコマンドを置き換えます。

sed -i 's,^\(example=\).*,\1'"$(date +%m/%d)"',' /path/to/config.cfg

または、date出力sed式を次のように指定します。

sed -i "$(date +'s,^\(example=\).*,\1%m/%d,')" /path/to/config.cfg

(しかしこれはちょっとぎこちないようですね。)

テキストの逆参照を使用して、式を少し短くしましたexample=。文字を含む代替部分の文字列を処理するため、 in をコマンドの区切り文字,として使用しています(代替はエスケープ文字を生成するための形式文字列として使用することです)。s///sed/%m\\/%ddate/

sed上記のコマンドの最初のバリエーションでは式全体が引用されるため、コマンドの置き換えの周りに二重引用符を使用する必要はありません。また、/gコマンドの最後にあるものは必要ありませんs///。これは、パターンが行の先頭に固定されているため、パターンが複数回一致することを期待できないためです。--あなたが使用したものも削除しました。一部のsed実装では、この文字列をバックアップサフィックス、つまりオプションのオプション引数-isedmacOSなど)としてほぼ確実に使用します。

date +%m/%d必要な日付形式を生成するために使用します。これで06/19今日の日付が作成されます。現在の日付の数字がゼロで埋められたくない場合は、%e代わりに使用してください%d(参照man strftime)。数値にゼロを追加せずに月を取得する標準形式はないようですが、GNUを使用するとdate非標準%-m形式を使用できます(例:date +%-m/%eman date)。

おすすめ記事