MD5を変更するために複数回実行しても、ファイルの末尾に1つの文字列を追加します。

MD5を変更するために複数回実行しても、ファイルの末尾に1つの文字列を追加します。

ファイルの md5 を時々一度、時には複数回変更する必要があります。私の友人は私にファイルの最後に文字列を追加するためにこのスクリプトを与えましたが、私はそれを何度も追加すると思いました。これが実際に他のものを編集しているかどうかはわかりません。使い始める前に確認してみたかったです。

#!/bin/sh
echo "md5change`date +%s`"
cat $1 | sed --in-place '/md5change/s/.*//' $1
sed -i '/^[ \t]*$/d' $1
echo "md5change`date +%s`" >> $1
echo "done"

ありがとう

答え1

スクリプトは、「md5change」という文字列を含むファイルに行があると仮定しているようです。画面にこのような文字列を表示し、その文字列を含む行を消去し(削除しない)、ファイル内のすべての空行を削除し、最後にファイルに新しい「md5change」行を追加します(必ずしも一致しません)。 1つを表示しecho、最後に「完了」を印刷します。ただし、そのcat $1 |部分$1はすでに「in-place」パラメータでレンダリングされているため、削除する必要がありますsed

編集:次のようにコードを圧縮できると思います。

timestamp=md5change$(date +%s)
echo "${timestamp}"
sed -i "/md5change/s/.*/${timestamp}/" "$1"
echo "done"

(注:このコードはファイル内のすべての空行を削除し、ファイルから複数の「md5change」エントリを削除し、ファイルの末尾に追加するため、コードテンプレートと同じではありません。この圧縮バージョンは既存の「md5change」を変更します. " "アイテムは新しいアイテムで構成されています。

答え2

ほぼ全部来ました!選択したツールを使用する1行の解決策は次のsedとおりですdate

$ sed -i "s/^md5change.*/md5change$(date +%s)/" FILE

なぜ私は2番目のコマンドが欲しいのかわかりません(非GNUではそれを認識しないかもしれませんが、sed空白以外の文字が欠落しているすべての行を削除します)。 GNUを想定し、参照セクションの最後に追加します。 GNUがない場合は、エスケープされたバージョンをリテラルタブに置き換えます。sed\t; /^[ \t]$/d

まだ「md5change」行がない場合、1行コードは機能しません。これを行うには、まず別の行が必要です。

#!/bin/sh
epoch=$(date +%s)
if grep ^md5change "$1"
  then sed -i "s/^md5change.*/md5change$epoch/" "$1"
  else echo "md5change$epoch" >> "$1"
fi

 

date +%sこれはいいえ持ち歩ける! POSIX標準はこれを指定しませんが、GNUバージョンとBSDバージョンの両方をサポートしていdateます。perl -e "print time"実際の言語(例:)を使用してすべてのロジックを実行できますperl

#!/usr/bin/perl -i -pn
$_ = $1 . time . "\n" if /^(md5change)/

$1これは、「md5change」で始まる行を見つけ、それをエポック(「md5change」)に関連付けられている一致する部分と改行文字に置き換えます。-i入力を上書きし(とsed -i同じ)、sed --in-place現在の行を表すデフォルト変数()を使用して-n入力の各行を繰り返し、コマンドの最後に(各行)を印刷します。$_-p$_-e

空行を削除するには、Perlの-pn引数を次のように変換し、-n最後に次の新しい行を追加します。print if /\S/

コマンドラインからこのスクリプトを1行スクリプトに変換することもできます。

$ perl -i -pne '$_ = $1 . time . "\n" if /^(md5change)/'

または

$ perl -i -ne '$_ = $1 . time . "\n" if /^(md5change)/; print if /\S/'

「md5change」行が欠落している入力ファイルを処理するには、次のようにします。

#!/usr/bin/perl -i
my $md5change = 0;
while (<>) {
  if (/^(md5change)/) {
    $_ = $1 . time . "\n";
    $md5change = 1;
  }
  print;
} continue {
  if (eof and not $md5change) {
    $md5change = 0;
    print "md5change" . time . "\n";
  }
}

関連情報