
現在の日付を月/日(例: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\\/%d
date
/
sed
上記のコマンドの最初のバリエーションでは式全体が引用されるため、コマンドの置き換えの周りに二重引用符を使用する必要はありません。また、/g
コマンドの最後にあるものは必要ありませんs///
。これは、パターンが行の先頭に固定されているため、パターンが複数回一致することを期待できないためです。--
あなたが使用したものも削除しました。一部のsed
実装では、この文字列をバックアップサフィックス、つまりオプションのオプション引数-i
(sed
macOSなど)としてほぼ確実に使用します。
date +%m/%d
必要な日付形式を生成するために使用します。これで06/19
今日の日付が作成されます。現在の日付の数字がゼロで埋められたくない場合は、%e
代わりに使用してください%d
(参照man strftime
)。数値にゼロを追加せずに月を取得する標準形式はないようですが、GNUを使用するとdate
非標準%-m
形式を使用できます(例:date +%-m/%e
注man date
)。