2

これが私のパラメータです:

  • MM / DD / YYYY(MM-DD-YYYY、MM.DD.YYYYなど)をMONTH、DAYYEARに変更する必要があります。例:2001年1月29日=>2001年1月29日。
  • これは、人間の読み取り出力になるためのものです。いくつかのコンピューターで、この変更を何度も行う必要があります。これを担当した前の人は手作業でやっていた。
  • 私はVIMに依存することができますが(サムドライブ上にあるため)、VIMにアクセスしたときに他に何もコンピューター上にありません。

課題:コンピューターごとに、これをすばやく修正するための正規表現を作成します。

これは私が持っているものです(区切り文字として#を使用):

%s#\([1-9]\|1[012]\)[- /.]\([1-9]\|[12][0-9]\|3[01]\)[- /.]\([19\|20]\d\d\)#UGLYPART \2, \3#g

正しい場所に\2と\3が表示されるので、検索部分は正しく機能します。UGLYPARTが\1を使用し、次のような評価を使用することはわかっています。

((\1)\=(1\|2\|3\|4\|5\|6\|7\|8\|9\|10\|11\|12)(January\|February\|March\|April\|May\|June\|July\|August\|September\|October\|November\|December)) 

それが機能することを除いて。

誰かが何か洞察を持っていますか?そこに約90%いるような気がします。それとも、Vimの正規表現をあまりにも多く求めていますか?

4

2 に答える 2

4

はい、使用する必要があります\=が、別の方法で使用されます。

%s#\v([1-9]|1[012])[\- /.]([1-9]|[12][0-9]|3[01])[- /.]((19|20)\d\d)#\=strftime('%B', 28*24*60*60*submatch(1)).' '.submatch(2).', '.submatch(3)#g

注:[]はコレクションであるため、ここに記述したものは、、、、、、またはとして[19\|20]扱われます。を使用する必要があります。そして、不必要な脱出を避けるために使用します。19\|20\(19\|20\)\v

注2:月のリストは書きたくありません。12月までは28日が1月、28 * 2 = 56日が2月、28 * 3 = 84日が3月というように、strftime()関数とタイムスタンプ0(秒単位)が1月1日であることがわかります。 (今年ではありませんが、これは問題ではありません)。ただし、ロケールによって異なります。英語のロケールでstrftime('%B', 28*24*60*60*1)は「1月」が出力されますが、私のシステムでは「Январь」が出力されます。

注3:\=置換ストリングの最初の位置に常にある必要があります。

于 2012-04-11T16:07:02.687 に答える
1

-eを使用して、vimを「行編集」(例)モードで使用できると思います。次に、編集コマンドのファイルを渡します。

これらのコマンドがdate.exにあると仮定します。

g/\([0-9][0-9]*\)[./-]1[./-]\([012][0-9][0-9]*\)/s//January \1, \2/
g/\([0-9][0-9]*\)[./-]2[./-]\([012][0-9][0-9]*\)/s//February \1, \2/
g/\([0-9][0-9]*\)[./-]3[./-]\([012][0-9][0-9]*\)/s//March \1, \2/
... etc ...
w
q

次にvimを次のように呼び出します

vim -e -S date.ex foo

ここで、fooは編集するファイルです。したがって、yoyは、ファイルシステム内のすべてのファイルに対してこれを実行するためのシェルスクリプトを持つことができます。

于 2012-04-11T15:33:38.130 に答える