上下文:我正在編寫一個shell腳本來幫助管理以文本文件以人類可讀方式存儲並使用普通文本編輯器進行編輯的簡單數據庫。 (每個條目是一個文本文件,其名稱是一個ID號,並且所有文件都存儲在一個目錄中。)POSIX正則表達式:僅在逗號分隔的項目內匹配
我目前的問題是搜索。有一些頭文件,它們基本上是文件頂部的數據字段。例如,我們來看一下標記字段,該字段從Tags:\t
(其中\t
是一個字面製表符)開始,然後有一個逗號分隔標記列表。我希望能夠將用戶提供的正則表達式插入到對grep
的更大調用中,並且只有在每個逗號分隔項內,用戶的正則表達式匹配。
下面是從我的文檔有點描述,我想發生什麼:
hregexes是僅在逗號分隔的項目匹配ERES。例如,對於首標Tags: foo, bar baz
:
REGEX :: MATCHES?
foo :: yes
bar :: yes
baz :: yes
az :: yes
.*baz :: yes
ba.*az :: yes
o, ba :: no
foo.*baz :: no
這將理想地純粹工作與POSIX擴展正則表達式,用於與系統的其餘部分的一致性;我有一個使用Python進行搜索的簡化版本,但決定我應該重寫那部分,以便系統不會搜索POSIX正則表達式和一些Python。
我確實試圖想出一個模式,但是我用regexps來做一些複雜的事情還不夠好。在以下嘗試中,$2
是我們正在查找的標題,並且$3
是在該標題中匹配的模式。
grep -El "$2: (|.*,|.*,)[^,]*$3[^,]*(,|\b)" *.dre
這不會錯過它應該抓住任何結果,但它的問題在於o, ba
和foo.*baz
都匹配時,他們不應該;在這一點上,我不妨只搜索$2: .*$3
。
如果這對於單個ERE來說是不可能的,那麼在Bash中是否有另一種好方法呢?我的數據庫已經有超過一千個文件,並且可以輕鬆增長到很多次,所以我不希望循環遍歷每個文件,然後遍歷逗號分隔列表中的每個項目,並且每次都會產生shell開銷。
我沒有嘗試,但它看起來像你在正確的軌道上。你也碰到了在純shell中能夠實現的限制,所以請記住,來自用戶的下一個功能請求可能會促使你用更低級的語言編寫一些幫助程序:) – Perry