複数の点がある(ファイルから)行を抽出(または計算)する必要があります。この行はドットで始まってはいけません。終わり点がある場合、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つを選択して固執します。- 問題は、正規表現(パターンなど)
([^.]+\.)+
の後にあることです。これは実際には次の[.]+
ものと同じであり、結果としてgrepは2つの点を探しています。確認すると、コマンドが一致することがわかります。[^.]+\.
[.]
text.text..
a.b..
- いいですね。修正はとても簡単だと思います。
grep -P '^[^.]+\.([^.]+\.)+[^.]*$'
つまり、[.]
に変更し(元の意図した[^.]
ものかもしれません)、次をに変更してを追加します。特定の数のグループの後には、ドット以外の数字(0個以上)の文字が必要/許可されます。ライン。+
*
$
text.
- より簡単な方法(理解しやすさ)は次のとおりです。
grep -P '^[^.]+\..*\.'file.txt | grep -v '\.\.'
1つ目は、ドット以外のgrep
文字で始まり、少なくとも2つのドットを含む行を探します。 2番目はgrep
2つの連続点を持つ行を削除します。 - そうするよりは
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つ以上の文字で区切る必要があることを意味します。
(?=.*\..*\.)
- 量子電気力学