リスト内の単語をフィルタリングしようとすると「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

議論する

次の2つの正規表現を比較します。最初は空のサブ式がなく、2番目は空のサブ式があります。

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

(none|such)一致noneまたはsuch。逆に(none|such|)一致するnoneか、suchまったく一致しません。すべての入力が最後の入力と一致するため、このegrep -vコマンドは入力のすべての内容を削除します。

答え2

エラーが空です|)。しかし、必要に応じて1行から特定の単語を削除、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))

関連情報