【发布时间】:2013-10-02 19:06:08
【问题描述】:
我只是将 cat /proc/cpuinfo 的输出存储到 bash 脚本中的变量中。
/proc/cpuinfo:
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 58 model name : Intel(R) Core(TM) i5-3230M CPU @ 2.80GHz stepping : 9 cpu MHz : 2562.759 cache size : 6144 KB fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc up rep_good nopl pni monitor ssse3 lahf_lm bogomips : 5125.51 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management:
当我将信息收集到文本文件并 grep 时:
grep -P '(?<=model name\s:\s)[\w ()-]*(?=CPU)' infotext.txt
我得到一个匹配:
model name : **Intel(R) Core(TM) i5-3230M** CPU @ 2.60GHz
但是,在我的 bash 脚本中对此进行测试后,我找不到匹配项:
regex='(?<=model name\s:\s).*(?=CPU)'
if [[ $line =~ $regex ]]; then
modelName=${BASH_REMATCH[1]}
fi
这可能与将 /proc/cpuinfo 的输出转换为文本文件与将其简单地存储在变量 cpuInfo=$(cat /proc/cpuinfo) 中的区别有关吗?
如果不是,我在 bash 中的正则表达式的格式是否会导致问题? (我可能需要另一种方式来对“型号名称:”和“CPU”进行前瞻/后瞻)。
【问题讨论】:
-
您尝试过
if [[ $line =~ "(?<=model name\s:\s)[\w ()-]*(?=CPU)" ]]; then吗? (将单引号改为双引号) -
Bash 正则表达式单独使用,不包含在
's 中。顺便说一句,我不确定 bash 正则表达式是否支持前瞻。 -
我试过用双引号,是的。考虑到正则表达式中的括号,单独使用正则表达式会产生错误。我可以尝试删除它们并以不同的方式匹配它们。在大多数情况下,我使用变量 regex='regexdata' 然后运行比较 - 这很有效。
-
关心:
cpuInfo=$(cat /proc/cpuinfo)的效果与cpuInfo="$(cat /proc/cpuinfo)"不同!!! (注意 双 引号) -
@F.Hauri,我没有在变量中使用双引号。我在正则表达式上使用引号。我只是询问输出到文件和变量之间的差异是否改变了我解析它的方式。