为什么这个简单的 grep/sed 脚本不起作用

为什么这个简单的 grep/sed 脚本不起作用

我有一个变量,其中一行看起来像这样

iBMC=277

我正在尝试像这样匹配:

BMC="$(echo "$allnow" | grep iBMC=[0-9] | sed 's/iBMC=//g')"

这使得 BMC 为空。这是它的样子bash -x

++ grep 'iBMC=[0-9] '
++ sed s/iBMC=//g
+ BMC=

我还必须匹配更多的东西,比如这一行:

Name="$(echo "$allnow" | grep stringName= | sed 's/stringName=//g')"

但结果也是空的。这是$allnow

QQ1=0999999
QQ2=00aaaaa
RR=yes
GG=no
stringName=skolan8
sTitle=
iBMC=277
L3-cache="8 MB"
Minne="16 GB"    

答案1

不需要使用 grep (可能是因为大量信息的性能问题,但我不认为存储在变量中的数据是这种情况)

BMC="$(echo "${allnow}" | sed -e '/iBMC=[0-9]/!d' -e 's/iBMC=//;q' )"

答案2

我喜欢@NeronLeVelu的答案,但是当我在一个文件中的两个地方看到相同或几乎相同的正则表达式时,我会感到怀疑sed。 ;)

果然,可以简化:

sed -n 's/iBMC=//;T;/^[0-9]/p'

或者,如果sed在没有 的情况下使用 BSD T,您可以使用草率的解决方法:

sed -n -e 's/iBMC=//;ta' -e 'b' -e ':a' -e '/^[0-9]/p'

另一方面,我们可以把整个事情变得简单:

sed -n 's/iBMC=\([0-9]\)/\1/p'

与我的第一个版本的长度完全相同,但可移植到 BSDsed

所以像这样包装它:

BMC="$(echo "$allnow" | sed -n 's/^iBMC=\([0-9]\)/\1/p')"
Name="$(echo "$allnow" | sed -n 's/^stringName=//p')"

答案3

后面的“空格”]实际上不是空格,而是¬†。在 BBEdit 中看起来是一样的,但是用 HexFiend 打开后,它向我显示了那个角色。 BBEdit 中有一些快捷键可以¬†代替空格。

答案4

<<IN \
grep '^iBMC=[0-9]\|^stringName=' |\
sed 's/^[[:lower:]]*//'
$allnow
IN

您可能还想检查文件是否有干净的行结尾,但我对此一无所知。

相关内容