이 간단한 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'

첫 번째 버전과 길이가 정확히 같지만 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

파일에 깨끗한 줄 끝이 있는지 확인하고 싶을 수도 있지만 그것에 대해서는 모르겠습니다.

관련 정보