サーバーエラーの次の質問/回答に従おうとします。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の非標準的な動作かもしれません。
式やサブ式にはどのような問題がありますか?
後でスクリプトはこれを次のように使用します。たとえば、-DDEBUG
andを削除し、およびを-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))