毎日追加する必要がある構成ファイルがあります。
例えば
report.lookback.days.to.retrieve.data=60
ファイルには、異なる値を含む上記の項目など、複数の項目が含まれています。プロパティファイルを開き、この特定のアイテムを検索したら、合計30日間毎日+1ずつ値を増やす必要があります。
例えば
report.lookback.days.to.retrieve.data=61
report.lookback.days.to.retrieve.data=62
report.lookback.days.to.retrieve.data=63
私はスクリプトに初めて触れましたが、これを行うためにどのような方法を使用できるのかわかりません。
awk、sed、カウンタの実装、またはメソッドの組み合わせを使用する必要がありますか?
答え1
自分が投稿したファイルと同様のファイルのみを編集するには、次の方法を使用します。
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=
使用される正規表現は、文字列(\d+
)の後に1つ以上の数字が続くものを見つけることです。\K
以前の一致を削除し$&
(一致したばかりの項目を保持する特殊変数)、数値のみを指すことを許可します。
$&+1
最後に、一致する値に1を足したものに置き換えます。これ(s///
評価演算子内部のもの)はs///e
最後にあるフラグによって有効になりますs///e
。
答え2
毎日その場でファイルを編集したい場合(おそらく不要な場合)、次のことができます。
$ 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
答え3
を使用してこれを行うのは非常に簡単です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
ユーティリティ(セクションその他のユーティリティ)利用可能:
awk -F= '{
if($1=="report.lookback.days.to.retrieve.data")
print $1"="$2+1
else
print
}' in_file |
sponge in_file
もちろん、入力ファイルに追加したい行以外に他の行が含まれていない場合(または含まれていてその行を削除したい場合)、awk
この部分を単純化することができます。