我正在尝试遵循服务器故障中的这个问题/答案:在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 的一种风格。但这可能是苹果的一些非标准行为。
表达式或子表达式有什么问题?
后来,脚本使用它如下。例如,我们想要删除-DDEBUG
and -DNDEBUG
,但保留-maes
, -mrdrnd
and -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))