[英]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.