尝试从列表中过滤掉单词时出现“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"

谷歌并没有给我提供太多帮助:“egrep:空(子)表达式”。其中一半看上去是中国人(字面意思)。

我尝试过我所知道的简单的东西,比如用双引号替换单引号,转义和不转义破折号,以及类似的初学者的东西。

我使用的是 OS X,这通常是 BDS 的一种风格。但这可能是苹果的一些非标准行为。

表达式或子表达式有什么问题?


后来,脚本使用它如下。例如,我们想要删除-DDEBUGand -DNDEBUG,但保留-maes, -mrdrndand -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)匹配nonesuch。相比之下,(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))

相关内容