単刀直入に言うと、grep/find/sed/awk を使用して特定の文字列 (数字で終わる) を照合し、その数字を 1 ずつ増やす方法を考えています。最も近いのは、1 を連結して主なポイントは単に値を変更することであるため、最後(これで十分に機能します)。これが私が現在行っていることです:
find . -type f | xargs sed -i 's/\(\?cache_version\=[0-9]\+\)/\11/g'
数字を増やす方法がわからなかったので、全体をキャプチャして「1」を追加しました。以前、私は次のようなものを持っていました:
find . -type f | xargs sed -i 's/\?cache_version\=\([0-9]\+\)/?cache_version=\11/g'
少なくとも、必要なものをキャプチャする方法を理解しています。
これが何のためにあるのかを説明する代わりに、私が何をしたいのかを説明します。現在のディレクトリに基づいて、任意のファイル内のテキストを再帰的に検索する必要があります (重要ではありません。任意のディレクトリである可能性があるため、後で構成します)。次に、その番号をインクリメントし、ファイル内で置き換えます。
現在、上記のものは機能していますが、最後に見つかった番号をインクリメントできないだけです。将来の値が「11」、「111」、「1111」、「11111」などにならないように、「1」を追加する代わりにインクリメントできるとよいでしょう。
私は何十もの記事/説明を見てきましたが、多くの場合、提案は を使用することですがawk
、私の人生ではそれらを混在させることはできません。awk
実際には何も置き換えないを使用することに最も近いのは次のとおりです。
grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'
sed
最後に a をパイプして元のファイル名を渡し、sed
ファイル名とインクリメントされた番号(からawk
)、または必要なものを何でも持つことができる方法があるかどうか疑問に思ってxargs
います。
技術的には、この数値は重要ではありません。この置換は、主にそこに新しい番号があることを確認するためのものであり、最後の番号とは 100% 確実に異なります。したがって、この質問を書いているときに、システム時間を使用する方がよいことに気付きました-エポックからの秒数(後続の「同一の」リクエストのキャッシュを排除するためにAJAXでよく使用される手法)。私はこれで終わりました、そしてそれは完璧に思えます:
CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"
(何らかの理由で数秒に及ぶ場合に備えて、最初に値を保存して、すべてのファイルが同じ値になるようにします)
しかし、一致した数を増やすという元の質問を知りたいです。簡単な解決策はそれをbashスクリプトにすることだと思いますが、それでも、すべてのファイルを再帰的にループし、その内容が一致するかどうかを確認してから置き換えるよりも簡単な方法があると思いました。 ...他の多くのロジックはありません。他のファイルなどに書き込みたくないだけです- sed
「i」オプションのように、その場で行う必要があります。