grepの否定の覚書です。
結論から言うと、grepコマンドに、-v オプションをつけてやると否定の検索ができます。
ことの顛末も書いておきます。
HTMLでリンクを記述する場合には、パラメーターの繋ぎに使う&を実体参照として、& と記述しなければならない。
今回は、そのチェックのために、複数ディレクトリに有る500ほどのファイルに存在する&および&を確認しようと思った次第です。
そこで、まずは、次のコマンドで、&の存在するファイルを確認。
grep -n '&' */*
こうしてやると、&を含む行が表示されますが、&のあるすべての行がすべて表示されるので、&が実体参照で正しく記述されているかの確認が困難です。
そこで、grepのAND検索と否定を利用して絞り込みをしていきます。
grep '&' */* | grep -vn '&&'
絞込みは、パイプ(|)を使います。また、否定には、-v オプションを使います。
こうしてやることで、&&の行を除外して検索できます。
同様に、次のようにします(実質1行)。
grep '&' */* | grep -v '&&' | grep -v 'nbsp' | grep -v 'amp' | grep -v 'gt' | grep -nv 'lt'
これで、&&や他の実体参照を除外できます。
ただし、これだと、&と実体参照が有る場合、&単独のものも表示されないので、他にもgrepをして確認します。
grep '&' */* | grep -n 'href'
こうしてやると&がある行で、かつ、リンクを作っているであろう行を絞り込み検索できます。
その他、いろいろ試してみて、リンク文字列に、&が単独で利用されていないか確認します。
もっとスマートなやり方もあると思いますが、急ぎの確認でざっと見るのにはこれで十分でした。
他のやり方があれば、コメントくださるとありがたいです。
なお、最初は、grepと正規表現での否定の検索を考えましたが、-v オプションの方が簡単だと思います。正規表現は難しい・・・。