0

私はマニュアルページを検索し、息をのむように読んでもこれがどうなっているのか、それを修正する方法をまだ理解できません...私は正規表現の初心者であることを認めているので、恥ではありません! (Ubuntu 12.04、bash 4.2.25、GNU grep 2.10)

他の多くの興味深いことを行うスクリプトの一部として (すべて動作しているようです)、ファイル名からデータを抽出しようとしています... 存在する特定の予想されるパターンがあります..たとえば、一部のファイル名には日付: 日付は "YYYY-MM-DD" の形式で簡単に取得できます。全体を grep で取り出し、後で grep することで分解'\b[0-9]{4}.{1}[0-9]{2}.{1}[0-9]{2}\b'できます (実際、通常は で直接年を安全にターゲットにすることができます'\b[0-9]{4}\b')。これは、入力が文字列は次のいずれかのようになります。

something 1989-07-23 something.jpg" or "foo-2013-01-10-bar.csv

wordsidon'tcareabout_2004-09-14_otherthings.tifしかし、またはこのfoofoobarbar_2010-07-16.gifgrepのように見える場合、一致するものは見つかりません。

アンダースコアで何が得られますか? なぜ正規表現が失敗するのですか? そして、私が知らないかもしれないこれを行うためのより良い方法はありますか? 私はごくわずかな perl と Java のスキルしか持っていませんが、bash についてはかなりよく知っています... または、知っていると思っていました...

ファイルの名前を変更できると思いますが、それはエレガントではないようです。

4

1 に答える 1

1

正規表現は\b、単語と単語以外の文字の境界に一致する を使用します。問題は、これは単語の文字であり、数字も同様であるため、 と の間に_境界がないことです。_2

使用できます

[^0-9][0-9]{4}.{1}[0-9]{2}.{1}[0-9]{2}[^0-9]

代わりは。日付がファイル名の先頭または末尾にある場合は、次を使用します。

([^0-9]|^)[0-9]{4}.{1}[0-9]{2}.{1}[0-9]{2}([^0-9]|$)
于 2013-07-25T17:17:41.797 に答える