grep + regex:如何編寫用於將資料與上下文敏感元素匹配的模式?

grep + regex:如何編寫用於將資料與上下文敏感元素匹配的模式?

假設有一段文字(彙編程式碼)

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 + 正規表示式來實現,但這會很複雜。您的任務需要一個完整的腳本或某種語言的程式。

以下不同命令的功能可能會有所幫助

  1. Grep 上下文:grep 提供的唯一上下文是行數beforeafter匹配行 [ -A, -B, -C(前兩者的組合)]
  2. Awk 和 Sed :使用它們您可以搜尋 2 種模式內的文字。

但同樣,這會變得很複雜。據我了解,您正在嘗試編寫某種解析器,因此您應該在開始編寫複雜命令之前研究並嘗試使用編寫工具。

相關內容