ファイルの文字列が正規表現と一致することを確認し、一致しない場合はその行の最初の文字列を印刷します。

ファイルの文字列が正規表現と一致することを確認し、一致しない場合はその行の最初の文字列を印刷します。

まずはまだ初心者なので学んでいます。

データセットファイルは次のとおりです。

101 80 10 27598 General Tao Vancouver 01:45:10 01:46:10 00:43:00 00:59:59 01:25:10

私は時間がフォーマットと一致することを確認しようとしていますが、/d/d:/d/d:/d/dその正規表現と一致しない場合は行の最初の数字(この場合は101)を印刷します。

私はCLIでライナーを試しましたが、成功しませんでした。

grep '/d/d:/d/d:/d/d' file.txt

その時も何も起こらなかった

edit1:データセットに01:4510または同様のデータがあります。

私が取得したいサンプル出力は次のとおりです。

104 80 10 27598 BigBelly Vancouver 01:4510 01:46:10 00:43:00 00:59:59 01:25:10

答え1

10進数を一致させる\dために正規表現演算子を使用することを考えてみました。perlただし、grepこれをサポートする実装はほとんどありません。標準同等物はです[[:digit:]]

一部のgrep実装\dはオプションの渡しをサポートしています-P(デフォルトの正規表現ではなくPerlと同様の正規表現を使用)。

したがって、これを使用して次のことができます。

grep -Pv '\d\d:\d\d:\d\d' < file.txt

このパターンに一致する文字列を含まない行を返します。

(参考にしてください。バックスラッシュいいえスラッシュ)

または:

grep -Pv '(\s+\d\d:\d\d:\d\d){5}\s*$' < file.txt

5つのタイムスタンプで終わらない行の場合。

この場合、最初のフィールドを返すには、次のことができます(サポートされているgrep実装を使用-o)。

grep -Po '^(?!.*(\s+\d\d:\d\d:\d\d){5}\s*$)\s*\K\S+' < file.txt

今回はgrep'を使用するのではなく、負の予測Perl正規表現演算子を使用します-v

macOS grep(使用中と言われましたが、今は削除しました)質問にタグを付けて次に置き換えます。)は、基本正規表現でサポートされている数少ない正規表現の1つですが、そうで\dないため、対応-Pする演算子(?!...)\K演算子は使用できません。

標準(およびクリーナー)に対応するものは次のとおりです。

awk '!/([[:digit:]]{2}:){2}[[:digit:]]{2}/ {print $1}' < file.txt

awk使用拡張正規表現これは別の方言です。インターバル演算子や文字クラスを含む一部の実装ではmawkまだサポートされていません。{2}

では、mawk次の操作を行います。

awk '!/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {print $1}' < file.txt

これは他の実装でも機能しますawkが、一部の実装では[0-9]0123456789以外の文字と一致する可能性があります(ASCII文字ではないため、入力に問題がない可能性があります)。

または、最後の5つのフィールドがパターンと一致していることを再確認してください。

awk '
  {
    for (i = 0; i < 5; i++)
      if (!($(NF-i) ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/)) {
        print $1
        next
      }
  }' < file.txt

関連情報