2つ以上の点を持つ線の抽出

2つ以上の点を持つ線の抽出

複数の点がある(ファイルから)行を抽出(または計算)する必要があります。この行はドットで始まってはいけません。終わり点がある場合、2つの点を連続することはできません(つまり、点はすべて非点字で区切られます)。

出力例:

a.b.
a.b.com
a.b.c.
a.b.c.com

しかし:

a.com
a..b
a.b.c..d

私は次のコマンドを実行しました。

grep -P '^[^.]+\.([^.]+\.)+[.]+' file.txt | wc -l

しかし、一致する行が見つかりません。どうすればいいですか?

答え1

  1. \.同じで[.]、どちらも他の文字ではなくリテラルポイントと一致します。スタイルに関する限り、1つを選択して固執します。
  2. 問題は、正規表現(パターンなど)([^.]+\.)+の後にあることです。これは実際には次の  [.]+ものと同じであり、結果としてgrepは2つの点を探しています。確認すると、コマンドが一致することがわかります。[^.]+\.[.]text.text..a.b..
  3. いいですね。修正はとても簡単だと思います。
    grep -P '^[^.]+\.([^.]+\.)+[^.]*$'
    つまり、[.]に変更し(元の意図した[^.]ものかもしれません)、次をに変更してを追加します。特定の数のグループの後には、ドット以外の数字(0個以上)の文字が必要/許可されます。ライン。+*$text.
  4. より簡単な方法(理解しやすさ)は次のとおりです。
    grep -P '^[^.]+\..*\.'file.txt | grep -v '\.\.'
    1つ目は、ドット以外のgrep文字で始まり、少なくとも2つのドットを含む行を探します。 2番目はgrep2つの連続点を持つ行を削除します。
  5. そうするよりはgrep … | wc -l、そうしてくださいgrep -c …

答え2

使用awk:

$ cat file
.com
.c.c.c.c
a.b.
a.b.com
a.b.c.
a.b.c.com
a.com
a..b
a.b.c..d
$ awk -F . 'NF > 2 && !/^\./ && !/\.\./' file
a.b.
a.b.com
a.b.c.
a.b.c.com

ここで、プログラムはawk点をフィールド区切り文字として使用します。 2つ以上の点がある線は、3つ以上のフィールドがある線と同じです。これがNF > 2テストがテストするものです。最初の正規表現は点で始まる行を削除し、2番目の正規表現は連続して2つ以上の点を含む行を削除します。残りの行を印刷します。

同じことgrep:

grep '\..*\.' file | grep -v -e '^\.' -e '\.\.'

最初の式は少なくとも2つの点を含む線を抽出し、他の2つの式は点で始まるか、2つの連続した点を含む線を削除します。

またはsed

sed -n '/^\./d; /\.\./d; /\..*\./p' file

答え3

以下のように周りを見回すことでこれを行うことができます。

$ grep -Pc '^(?!\.)(?!.*\.\..*)(?=.*\..*\.)' file.txt

読む:

  • 行の一番前に立って右を見る^
  • 行が文字通りの点で始まらないことを確認しました。(?!\.)
  • より遠くに見ると、2つの連続したテキストポイントは表示されません。(?!.*\.\..*)
  • ただし、2つの点が見えますが、以前の予測から連続した点を除外したため、2つの点を1つ以上の文字で区切る必要があることを意味します。(?=.*\..*\.)
  • 量子電気力学

関連情報