목록에서 단어를 필터링하려고 할 때 "egrep: 빈 (하위)표현식" 발생

목록에서 단어를 필터링하려고 할 때 "egrep: 빈 (하위)표현식" 발생

서버 오류의 다음 질문/답변을 따르려고 합니다.tail -f에서 특정 키워드가 포함된 콘텐츠를 필터링하는 방법은 무엇입니까?

다음은 제작중입니다egrep: empty (sub)expression:

# Respect user's preferred flags, but filter the stuff we explicitly test
#  Retain allowed flags in ADD_CXXFLAGS
if [ ! -z "CXXFLAGS" ]; then
    ADD_CXXFLAGS=$(echo "$CXXFLAGS" | egrep -v '(\-DDEBUG|\-DNDEBUG|\-O[0-9]|\-Os|\-Og|)')
else
    ADD_CXXFLAGS=
fi

echo "User CXXFLAGS: $CXXFLAGS"
echo "Retained CXXFLAGS: $ADD_CXXFLAGS"

Google은 나에게 별로 도움이 되지 않았습니다."egrep: 빈 (하위)표현식". 그들 중 절반은 (문자 그대로) 중국인처럼 보였습니다.

나는 작은따옴표를 큰따옴표로 바꾸기, 대시를 이스케이프하거나 이스케이프하지 않는 것과 유사한 초보자용 작업과 같이 내가 아는 간단한 작업을 시도했습니다.

나는 일반적으로 BDS의 특징인 OS X를 사용하고 있습니다. 그러나 이는 Apple의 비표준적인 동작일 수 있습니다.

표현식이나 하위 표현식에 어떤 문제가 있나요?


나중에 스크립트에서는 이를 다음과 같이 사용합니다. 예를 들어, -DDEBUGand를 제거하고 , 및을 -DNDEBUG유지 하려고 합니다 . 따라서 일부 플래그는 필터링하고 다른 플래그는 필터링하지 않으려고 합니다.-maes-mrdrnd-mrdseed

# Test Debug build, -O2
export CXXFLAGS="-DDEBUG -g2 -O2 $ADD_CXXFLAGS"
make...

# Test Release build, -O2
export CXXFLAGS="-DNDEBUG -g2 -O2 $ADD_CXXFLAGS"
make...

# Test Debug build, -O3
export CXXFLAGS="-DDEBUG -g2 -O3 $ADD_CXXFLAGS"
make...

# Test Release build, -O3
export CXXFLAGS="-DNDEBUG -g2 -O3 $ADD_CXXFLAGS"
make...

...

답변1

바꾸다:

egrep -v '(\-DDEBUG|\-DNDEBUG|\-O[0-9]|\-Os|\-Og|)'

그리고:

egrep -v '(\-DDEBUG|\-DNDEBUG|\-O[0-9]|\-Os|\-Og)'

이렇게 하면 정규식 끝에 있는 빈 하위 표현식이 제거됩니다 egrep.

논의하다

다음 두 정규식을 비교합니다. 첫 번째는 빈 하위 표현식이 없고 두 번째는 빈 하위 표현식이 있습니다.

$ echo abc | egrep -v '(none|such)'
abc
$ echo abc | egrep -v '(none|such|)'
$

(none|such)일치 none또는 such. 반대로 (none|such|)일치 none하거나 such전혀 일치하지 않습니다. 모든 입력이 마지막 입력과 일치하므로 이 egrep -v명령은 입력의 모든 내용을 삭제합니다.

답변2

오류가 비어 있습니다 |). 그러나 원하는 경우한 줄에서 특정 단어 제거,egrep은 도움이 되지 않습니다. 다음과 같은 것을 사용해야 합니다 sed:

export ADD_CXXFLAGS=$(echo " $CXXFLAGS " | sed 's/ /  /g;s/ \(-DDEBUG\|-DNDEBUG\|-O[0-9]\|-Os\|-Og\) / /g')

위의 내용은 로고 주위에 공백을 추가하여 단순화한 다음 단어를 공백으로 바꿉니다. 그러므로 CXXFLAGS="-DDEBUG -g2 -O2 $ADD_CXXFLAGS"가 된다 ADD_CXXFLAGS=-g2.


Makefile에서 이 작업을 수행할 수 있습니다.

ADD_CXXFLAGS=$(filter-out -DDEBUG -DNDEBUG -O1 -O2 -O3 -04 -O5 -O6 -O7 -O8 -O9 -Os -Og, $(CXXFLAGS))

관련 정보