この単純な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の答えは気に入っていますが、ファイルの2つの場所で同じまたはほぼ同じ正規表現を見ると疑わしいです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'

最初のバージョンと長さはまったく同じですが、BSDに移植可能ですsed

したがって、次のように梱包してください。

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

ファイルにきれいな行末があるかどうかを確認したいかもしれませんが、それについてはわかりません。

関連情報