
假設有一段文字(彙編程式碼)
st.w av,d15
ld.w d15,av
假設我們想用 grep 來搭配它。我們可以使用這個模式:
pattern=\
'\s+st.w\s+av,.*'\
'\s+ld.w\s+.*,av'
注意:我們用來.*
匹配暫存器名稱。將來這些暫存器名稱可能會更改。
假設我們想要對暫存器名稱使用特殊的正規表示式。我們新增特殊@reg
關鍵字:
pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@reg,av'
然後我們為 grep 模式添加一個前置函數,將所有特殊關鍵字替換為實際的正規表示式模式:
preprocess_pattern () {
local result=$1
# Replace @reg to exact regex pattern [a..d][0..15].
result=${result//'@reg'/'[a-d](1[0-5]|[0-9])'}
# Add other replacements (if need).
#result=${result//''/''}
echo "$result"
}
然後我們preprocess_pattern()
在執行之前調用grep
:
pattern="$(preprocess_pattern $pattern)"
if ! grep -Pzo $pattern code.asm > /dev/null
then
echo "grep #$i failed (pattern: "$pattern")"
((++failed))
fi
它有效,但我們想要更多。
我們要添加@preg
,即以前的暫存器。
pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@preg,av'
現在的問題是:在哪裡(以及如何)添加邏輯,在每次出現之後@reg
節省d15
特殊堆疊/緩衝區中以及每次出現後的匹配值(在我們的例子中)@preg
檢索@preg
來自堆疊/緩衝區的匹配值,並根據?的值檢查該值
換句話說:如何寫模式來匹配數據上下文相關元素? grep 可以嗎?
如果是(即可能)那麼如何描述這一點情境敏感性在模式中?
如果不(即不可能)那麼還有什麼辦法可以解決這個挑戰呢?
答案1
您想要實現的目標可能可以透過 grep + 正規表示式來實現,但這會很複雜。您的任務需要一個完整的腳本或某種語言的程式。
以下不同命令的功能可能會有所幫助
- Grep 上下文:grep 提供的唯一上下文是行數
before
和after
匹配行 [-A
,-B
,-C
(前兩者的組合)] - Awk 和 Sed :使用它們您可以搜尋 2 種模式內的文字。
但同樣,這會變得很複雜。據我了解,您正在嘗試編寫某種解析器,因此您應該在開始編寫複雜命令之前研究並嘗試使用編寫工具。