我正在處理上面提到的非常簡單的正則運算式問題:(0x90\s*){4,}
我的問題是,如何將其擴展到出現超過 4 次的任何十六進制數。
假設我在一個檔案中有以下內容:
0x90 0x90 0x90 0x90
0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80
0x10 0x10 0x10
我想撰寫一個正則運算式來匹配前 2 行,因為 0x90 出現了 3 次以上,然后 0x80 在它自己的行中出現了 3 次以上。0x10 正好出現 3 次,所以不會有任何匹配。
這是我嘗試過的:
(0(x|x)[0-9a-fA-F] \s*)\1{3,}
它的撰寫方式似乎有效,但前提是行尾至少有一個空格。例如,此正則運算式將匹配第一行 0x90 0x90 0x90 0x90 僅當最后一個 0x90 之后有空格時。我認為這個問題是用\s*?
uj5u.com熱心網友回復:
它僅在示例資料末尾有空格時才匹配的原因是因為反向參考參考\1了也匹配空格的組 1。
(0(x|x)[0-9a-fA-F] \s*)\1{3,}
^^^^^^^^^^^^^^^^^^^^^^^
group 1
請注意,此捕獲組(x|x)匹配 x 或 x,這與(x)
您可以使用(0x[0-9a-fA-F] )后跟空白字符和對沒有空格的組 1 的反向參考 3 次或更多次來創建單個捕獲組。
(0x[0-9a-fA-F] )([[:space:]]\1){3,}
正則運算式演示
arr=(
"0x90 0x90 0x90 0x90"
"0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80"
"0x10 0x10 0x10"
"0x90 0x90 0x90 0x90 "
)
pattern='(0x[0-9a-fA-F] )([[:space:]]\1){3,}'
for i in "${arr[@]}"
do
if [[ "$i" =~ $pattern ]]
then
echo "Match: ${BASH_REMATCH[0]}"
else
echo "No match: $i"
fi
done
輸出
Match: 0x90 0x90 0x90 0x90
Match: 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80
No match: 0x10 0x10 0x10,
Match: 0x90 0x90 0x90 0x90
uj5u.com熱心網友回復:
使用 grep 擴展正則運算式:
grep -E '(0x([[:xdigit:]]){2}[[:space:]]?){4,}'
由于這個問題被標記為bash:
#!/usr/bin/env bash
while read -r line || [ "$line" ]; do
[[ $line =~ (0x([[:xdigit:]]){2}[[:space:]]?){4,} ]] && printf '%s\n' "$line"
done < inputfile
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397159.html
上一篇:如何從檔案內容中洗掉交替的空格
