Text-Processing

提取具有兩個或更多點的線

  • April 23, 2019

我需要提取(或計算)具有兩個或多個點的行(在文件中)。行不應該以點開頭(如果以點結尾也可以),並且不能有兩個點連續(即點都用非點字元分隔)。

輸出範例:

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. \.並且[.]是等價的——它們都匹配一個文字點,而不是任何其他字元。作為風格問題,選擇一個並始終如一地使用它。
  2. 您的問題是您的正則表達式(即模式)([^.]+\.)+後跟 [.]+. 這實際上(有點)等價於[^.]+\., [.]結果是您的 grep 正在尋找包含 的行 ,即連續兩個點。如果你檢查,你會看到你的命令匹配。*text***.***text***..**``a**.**b**..**
  3. 好的,我相信修復相當簡單:
grep -P '^ [^.] + \. ([^.] + \.) + [ ***^*** .] **** $*** '

即,將 to 更改[.][^.](也許這就是您最初的意思?),將以下內容更改+為 an *,然後添加 a $。在一定數量的組之後,要求/允許除點之外的任何數量(零個或多個)字元,直到行尾。*text***.** 4. 一個更簡單的方法(更容易理解)是

grep -P '^[^.]+\..*\.' 文件.txt | grep -v '\.\.'

第一個grep查找以非點字元開頭並包含至少兩個點的行。第二個grep刪除具有兩個連續點的線。 5. grep … | wc -l與其做,不如做grep -c …

引用自:https://unix.stackexchange.com/questions/513702