Text-Processing
提取具有兩個或更多點的線
我需要提取(或計算)具有兩個或多個點的行(在文件中)。行不應該以點開頭(如果以點結尾也可以),並且不能有兩個點連續(即點都用非點字元分隔)。
輸出範例:
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
但它沒有找到任何匹配的行。我該怎麼做?
\.
並且[.]
是等價的——它們都匹配一個文字點,而不是任何其他字元。作為風格問題,選擇一個並始終如一地使用它。- 您的問題是您的正則表達式(即模式)
([^.]+\.)+
後跟[.]+
. 這實際上(有點)等價於[^.]+\.
,[.]
結果是您的 grep 正在尋找包含 的行 ,即連續兩個點。如果你檢查,你會看到你的命令匹配。*text***.***text***..**``a**.**b**..**
- 好的,我相信修復相當簡單:
grep -P '^ [^.] + \. ([^.] + \.) + [ ***^*** .] **** $*** '
即,將 to 更改
[.]
為[^.]
(也許這就是您最初的意思?),將以下內容更改+
為 an*
,然後添加 a$
。在一定數量的組之後,要求/允許除點之外的任何數量(零個或多個)字元,直到行尾。*text***.**
4. 一個更簡單的方法(更容易理解)是grep -P '^[^.]+\..*\.' 文件.txt | grep -v '\.\.'
第一個
grep
查找以非點字元開頭並包含至少兩個點的行。第二個grep
刪除具有兩個連續點的線。 5.grep … | wc -l
與其做,不如做grep -c …
。