2016-04-14 3 views
1

複数行のファイルがあります。すべての行は、C10またはZ12で始まります。GNU正規表現:C10またはZ12のすべての行を確認してください。

C10またはZ12(3行目の例のように)で始まらない行があります場合、私はGNU正規表現でファイル全体をチェックしたいと思います。

C10  USE/0712015/004  831252  00248235 EUR 20071205    42.25 12137377-40-5       USE/071205/004  Mika Muuu 
Z12  USE/0712015/018  831252  01087484 EUR 20071405   400.00 8782400        USE/071205/018  Bada Bing 
     USE/0712015/021  831352  01017484 EUR 20271205   410.00 8782400-10-5       USE/071405/017 Bubu 
Z12  USE/0712015/091  131252  01087484 EUR 20171205   540.00 8782400-1        USE/071205/018  Foo 
C10  USE/0712015/008  232252  00248235 EUR 30071205    42.25 12137377-40-5       USE/071205/004  Boo 

ありがとうございます!

+0

ヒント: ''^'で始まる正規表現とgrepをする-V'。 – bishop

+0

あなたは素晴らしいです、ありがとう! 私はすべての行を検索するためにこれを追加しなければならないと分かったと思います: /^(?!C10|Z12).*/m 今私は "POSIX拡張正規表現" [アプリケーション](https://www.zabbix.com/documentation/2.4/manual/regular_expressions) だから!仕事はありません。申し訳ありません、私の悪い! POSIX拡張正規表現を使って、どうすればいいですか? – DiViNe

+0

Sry、私は上記のポストで@Aaronを忘れてしまった。 – DiViNe

答えて

1

PERL(-P)の拡張サポートを使用する2つの方法で簡単に(理解するのが)容易になります。grep否定先読みは通常grepでサポートされていないため、-Pオプションを使用する必要があります。

また、あなたは否定先読みを使用して見つけているものは何でも、単一引用符ではなく二重引用符の中でそれを維持しそうbashエラー

grep -P '^(?!Z12)' input_file | grep -P '^(?!C10)' 

があるでしょうあなたは、単一のgrep

grep -P '^(?!Z12|C10)' input_file 

ようにそれをも行うことができます
+1

'grep -P '^(?C10 | Z12)''もうまくいきます。 – Aaron

+1

ああ、bashエラーについて:歴史のコマンドで '!...'トークンを置き換えるbash履歴拡張です。一重引用符を使うとうまくいきますが、 'set + H 'でそれを無効にすることもできます。 [スーパーユーザー]に関する詳細情報(http://superuser.com/questions/133780/in-bash-how-do-i-escape-an-exclamation-mark) – Aaron

+0

@Aaron私は知っていますが、複数の「greps」..それは流れを保つ: - それは最初にあなたが1つの条件で拒絶しているものであり、何が残っていてもあなたは他の条件に基づいて拒絶している...だから私はそれを書いた.. – rock321987

3

C10またはZ12で始まる行を一致させる必要があります。

  • C10はC10が
  • Z12が行の先頭にC10に一致するライン
  • ^C10の開始と一致します
  • ^ Z12
  • に一致する一致する
  • (C10|Z12) C10又はZ12
  • ^(C10|Z12)にマッチする意志行頭のC10またはZ12と一致する

これで、この一致を元に戻すことができます:grep -vE '^(C10|Z12)' fileは、C10またはZ12で始まらない行を返します。

あなたが正規表現の結果を反転することができますgrepまたは別のツールを持っていない場合でも、次のいくつかの手順でそれを行うことができます。

  • (?!pattern)否定先読みである:それは一致しますパターンは
  • (?!C10|Z12)試合はどこでもC10が続いていませんしないこともZ12
  • ^(?!C10|Z12)はC10もZ12
  • で始まらない行の先頭に一致する場合にのみ、は、C10またはZ12で始まらないフルラインと一致します。
0

ネガティブ先読みのいくつかの選択肢があります。これらの中で、inputという名前のファイルがあなたのデータを含んでいると仮定します。grep -v

  • 連続フィルタリング:すべてのスペースで始まる

    grep -v '^C10' input | grep -v '^Z12'

  • ライン:AWKを使用して

    grep '^ *USE' input

  • awk '!/^(C10|Z12)/' input

関連する問題