2014年2月23日日曜日

正規表現のパターンにヒットするファイルをmv

結論から

普通の正規表現
先頭不一致は「^」と「?!」で行けるはずが、egrepはなぜか癖がある?
例えば「先頭DELが付いていない」の正規表現は'^(?!DEL).*'ですが、egrepだと
'^[^(!DEL)].*'になります。

ls /home/from/ | egrep '^[^(DEL)][0-9]{6}.*(US)$' | xargs -I{} mv {} /home/to/

意味は"/home/from"の下のファイルやフォルダを対象に、先頭が"DEL"以外、数字6桁の次に
任意の長さの文字列が続き、最後"US"で終わるモノを全て"/home/to"に移動する

勉強:
ファイル名のみ縦表示する
#ls -1

すごくお世話になった正規表現チェッカー
http://regexpal.com/

egrepで先頭不一致(パターン)の正規表現
サンプルでは先頭が"DEL"以外すべてヒットする書き方
egrep '^[^(DEL)].*'
egrep
構文
egrep [オプション] [正規表現パターン] ファイル名

-i 検索する際、大文字小文字を区別しない
-n マッチした行の行番号も表示する。
-c マッチした行数を出力する。
-v マッチしない行を出力する。
-[数値] マッチした行の前後[数値]行も出力する。
-A [数値] マッチした行の後[数値]行も出力する。
-B [数値] マッチした行の前[数値]行も出力する。

以下正規表現
※「」は正規表現ではなく、パターン文字列を囲む記号です。
「.」→ 任意の一文字
「*」→ 0回以上の繰り返し

「.*」→ 任意文字列、空文字列もOK

「^」→ 行頭マッチ
「$」→ 行末マッチ

「^#.*t$」→ #から始め、tで終わる任意の長さの文字列
"#this is a comment" → ◯
"#this is a title" → ×
"this is not a comment" → ×

「[ABC]」→ A,B,Cのいずれか
「[A-Z]」→ A~Zの範囲いずれか

^[A~Za-z0-9]*$ → 文字列がすべて大文字と小文字と数字のモノがヒット
「\w」→ 英数字
「\W」→ 英数字以外
「\d」→ 数字
「\D」→ 数字以外
「\s」→ スペース
「\S」→ スペース以外

ですから
「^[A~Za-z0-9]*$」 と 「\w*$」 は同じ効果

"abcdefg1234" → ◯
"abc defg1234" → ×

「(abc)」→ "ABC"というフレーズがヒットする
「[^(ABC)]」→ "ABC"フレーズを含まない
「[^ABC]」→ ABCいずれでもない
「[^A-Z]」→ A~Zの範囲いずれでもない

"^(DEL).*" → 先頭が"DEL"なっている文字列
"^(?!DEL).*" → 先頭が"DEL"なっていない文字列

「{n}」→ n回の繰り返し

「^\d{8}.*」→ 8桁数字から始める文字列すべて
"20140102ABCDEFG123" → ◯


「{n},」→ n回以上の繰り返し
「{n,m}」→ n回以上m回以下の繰り返し
「p1|p2」→ 正規表現p1かp2のいずれか

「^(FR|CN).*(US)$」→ "FR"または"CN"で始め、"US"で終わる全ての文字列

0 件のコメント:

コメントを投稿