web-dev-qa-db-ja.com

構成ファイル内のルックバック値を毎日+1します

毎日インクリメントする必要のある構成ファイルがあります。

例えば。

report.lookback.days.to.retrieve.data=60

このファイルには、上記のように異なる値を含む複数のエントリが含まれています。この特定のエントリのプロパティファイル検索を開き、値を毎日+1ずつ増やして合計30日間にする必要があります。

例えば。

report.lookback.days.to.retrieve.data=61

report.lookback.days.to.retrieve.data=62

report.lookback.days.to.retrieve.data=63

私はスクリプトを初めて使用しますが、どの方法でこのタスクを実行できるかわかりません。

Awk、sed、カウンターの実装、またはメソッドの組み合わせを使用する必要がありますか?

2
user65231

毎日その場でファイルを編集したいだけで、おそらくやりたくない場合は、次のようにすることができます。

$ echo 'report.lookback.days.to.retrieve.data=61' \
    | awk -F= '
        /report.lookback.days.to.retrieve.data/{
            printf("%s=%d\n", $1, $2+1)
        }
    '
report.lookback.days.to.retrieve.data=62

ただし、その場合は一時ファイルに保存してから、毎回元のファイルを置き換える必要があります。 devnullで述べたように、値を$varsに置き換え、引数を使用してスクリプトを呼び出すことをお勧めします。

1
user61786

投稿したファイルのように見えるファイルを編集したいだけの場合は、

Perl -i  -pe 's/report.lookback.days.to.retrieve.data=\K\d+/$&+1/e' file

説明

-iはインプレース編集を有効にするため、変更は元のファイルに保存されます。-pは、「-eで指定されたスクリプトを実行した後に各行を印刷する」ことを意味します/

s///は置換演算子であり、s/source/replacementのように機能します。

使用される正規表現は、文字列report.lookback.days.to.retrieve.data=の後に1つ以上の数値(\d+)が続くものを探しています。 \Kは以前に一致したものをすべて破棄し、$&を許可します。これは、一致したばかりのものを保持する特別な変数であり、数値のみを指します。

最後に、一致した値に1を加えた$&+1に置き換えます。これ(s///演算子内で何かを評価する)は、s///eの最後にあるs///eフラグによってアクティブになります。

1
terdon

これはawkで行うのは非常に簡単ですが、標準的なアプローチは、Linux mktempを使用して、一時ファイルに出力してから元のファイルを置き換えることです。

tempfile=$(mktemp --tmpdir=.)
awk -F= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file >"$tempfile"
mv "$tempfile" in_file

awkの一部のバージョンには-i(インプレース)オプション。つまり、次のことができます。

awk -iF= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file

または、spongeユーティリティ( moreutils の一部)が使用可能な場合:

awk -F= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file |
sponge in_file

もちろん、入力ファイルにインクリメントしたい行以外の行が含まれていない場合(または、追加して削除したい場合)、awkの部分を簡略化できます。

0
Graeme