[英]Grep regex contained in a file (not grep -f option!)
我正在閱讀一些設備配置輸出,並根據硬件配置檢查配置是否正確。 模板配置存儲為包含所有參數的文件,並且這些行包含正則表達式(基本上只是為了考慮輸出中“object”,“param”和“value”之間的可變空格數,還有一些索引方差)
首先,我不能使用grep -f $template $output
,因為我必須分別處理模板的每一行。 我有類似的東西在運行
while read line
do
attempt=`grep -E "$line" $file`
# ...etc
done < $template
如果模板不包含正則表達式,哪個工作正常。 問題:當這些是讀取表單文件時,grep會逐字地解釋搜索選項。 我自己測試了正則表達式,它們在命令行中運行良好。
在此背景下,問題是:
如何從文件中讀取正則表達式(逐行)並讓grep不按字面解釋它們?
使用-F
選項或fgrep
。
更重要的是,您似乎想要匹配整行:添加-x
選項。
使用以下腳本:
#!/usr/bin/env bash
# multi-grep
regexes="$1"
file="$2"
while IFS= read -r rx ; do
result="$(grep -E "$rx" "$file")"
grep -q -E "$rx" "$file" && printf 'Look ma, a match: %s!\n' "$result"
done < "$regexes"
以及包含以下內容的文件:
$ cat regexes
RbsLocalCell=S.C1.+eulMaxOwnUuLoad.+100
$ cat data
RbsLocalCell=S1C1 eulMaxOwnUuLoad 100
我得到這個結果:
$ ./multi-grep regexes data
Look ma, a match: RbsLocalCell=S1C1 eulMaxOwnUuLoad 100!
這適用於不同的間距
$ cat data
RbsLocalCell=S1C1 eulMaxOwnUuLoad 100
$ ./multi-grep regexes data
Look ma, a match: RbsLocalCell=S1C1 eulMaxOwnUuLoad 100!
好像對我來說。
另一點:通過在引號中加入"$line"
,確保shell不會以某種錯誤的方式解釋模式。
總而言之,你最好寫一個perl而不是shell腳本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.