“egrep: expressão vazia (sub)” ao tentar filtrar palavras de uma lista

1

Estou tentando seguir esta pergunta / resposta da Falha do servidor: Na parte final -f, como faço para filtrar o material que tem determinadas palavras-chave?

O seguinte está produzindo 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"

O Google não me ajudou muito em fornecer sugestões: "egrep: empty (sub) expressão ". Metade deles parecia chinês (literalmente).

Eu tentei as coisas simples que conheço, como substituir aspas simples por aspas duplas, escapar e não escapar do traço e coisas semelhantes para iniciantes.

Estou no OS X, que geralmente é um sabor dos BDSs. Mas isso pode ser algum comportamento não padronizado da Apple.

O que há de errado com a expressão ou sub-expressão?

Mais tarde, o script é usado da seguinte forma. Por exemplo, queremos remover -DDEBUG e -DNDEBUG , mas reter -maes , -mrdrnd e -mrdseed . Daí a razão pela qual queremos filtrar algumas bandeiras, mas não outras.

# 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...

...
    
por jww 27.10.2015 / 08:29

2 respostas

1

Seu erro é o vazio |) . No entanto, se você quiser remover certas palavras de uma única linha , o egrep não ajudará você. Você precisa usar algo como sed :

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

O texto acima adiciona um espaço em torno dos sinalizadores para simplificar e, em seguida, substitui qualquer um dos seus palavras por um espaço. Portanto, CXXFLAGS="-DDEBUG -g2 -O2 $ADD_CXXFLAGS" se torna ADD_CXXFLAGS=-g2 .

Note que você pode fazer esse tipo de manipulação dentro do Makefile:

ADD_CXXFLAGS=$(filter-out -DDEBUG -DNDEBUG -O1 -O2 -O3 -04 -O5 -O6 -O7 -O8 -O9 -Os -Og, $(CXXFLAGS))
    
por 27.10.2015 / 09:10
2

Substituir:

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

Com:

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

Isso remove a subexpressão vazia no final do egrep regex.

Discussão

Compare os dois seguintes regexes, o primeiro sem uma subexpressão vazia e o segundo com um:

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

(none|such) corresponde a none ou such . Por contraste, (none|such|) corresponde a none ou such ou nada. Como todas as entradas correspondem à última, o comando egrep -v remove tudo da entrada.

    
por 27.10.2015 / 08:44