簡體   English   中英

如何從字符串“ATATAT”中刪除2次出現的字符串“ATAT”。 我只得到一個

[英]How can I grep 2 occurrences of string “ATAT” out of string “ATATAT”. I only get one

我試圖寫一個命令來grep字符串中出現的次數,但我的字符串是“ATATAT”,我想grep“ATAT”。 當我使用命令時,我期望得到2個輸出我只得到1。

echo "ATATAT" |grep -o "ATAT" 

我試過用**包圍字符串但仍然只匹配一個模式。

最簡單的方法 - 讓Python為您完成:

python -c "import re; print(re.findall(r'(?=(ATAT))', 'ATATAT'))"
['ATAT', 'ATAT']

與bash的漫長道路:

string="ATATAT"
regex="ATAT"
length="${#string}"
counter=0

for((i=0;i<$length;i++)); do
  [[ "${string:$i}" =~ ^$regex ]] && ((counter++))
done

echo "$counter"

輸出:

2

受Python回答的啟發,這是使用ripgrep的解決方案

$ echo 'ATATAT' | rg -oP '(?=(ATAT))' -r '$1'
ATAT
ATAT
$ echo 'ATATXAT' | rg -oP '(?=(ATAT))' -r '$1'
ATAT
$ echo 'ATATATATAT' | rg -oP '(?=(ATAT))' -r '$1'
ATAT
ATAT
ATAT
ATAT

(?=(ATAT))是一個積極的先行(參見這個正則表達式是什么意思? ),它將檢查一個條件而不消耗字符,從而可以進行重疊匹配。 -r選項允許用其他東西替換匹配的部分。

或者,使用perl

$ # the if condition is there to prevent empty lines for non-matching input lines
$ echo 'ATATATATAT' | perl -lne 'print join "\n", //g if /(?=(ATAT))/'
ATAT
ATAT
ATAT
ATAT


如果您只需要計數:

$ echo 'ATATATATAT' | rg -coP '(?=(ATAT))'
4
$ # with GNU grep, if PCRE is available
$ echo 'ATATATATAT' | grep -oP 'AT(?=(AT))' | wc -l
4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM