質問: 以下のようなテキストがある時に、 ``` A-7-2 D-1-5 D-1-5 A-1 D-1-5,A-2-5 G-5-21,B-3,A-2-5 ``` 「アルファベット-数字-数字」以外(ここでは `A-1` と `B-3`)のみが抽出されるようにしたいです。 どのような正規表現を用いれば良いでしょうか。よろしくお願いします。
回答: 1)カンマ(`,`)区切りのデータを考慮しない場合 nekketsuuuさんのご指摘どおり、以下のような単純な文字列抽出では ``` cat テキストファイル | egrep -v '^[A-Z]-[0-9]-[0-9]$' ``` 5行目の`D-1-5,A-2-5`も抽出されてしまいます。 2)カンマ(`,`)区切りの行のすべての項目が条件に合致したときは抽出しない場合 ``` cat テキストファイル | gawk ' { patern = "^[A-Z]-[0-9]-[0-9]$" split($0, a, ",") hit = 0; for(i in a){ if(match(a[i] , patern)){ hit = 1 } } if(!hit){ print $0 } } ' ``` 実行環境は以下です。 Ubuntu 18.04.3 LTS ※WSL下です gawk GNU Awk 4.1.4 egrep grep (GNU grep) 3.1 bash GNU bash, バージョン 4.4.20(1)-release (x86_64-pc-linux-gnu)