Vamos dar uma olhada na definição de limite de palavras:
There are three different positions that qualify as word boundaries:
- Before the first character in the string, if the first character is a word character.
- After the last character in the string, if the last character is a word character.
- Between two characters in the string, where one is a word character and the other is not a word character.
Nenhum limite de palavra pode corresponder entre um caractere sem palavra e um traço, porque um traço também não é um caractere de palavra.
Também desde, por exemplo, slashes também não são caracteres de palavras e porque você não tem espaços nos caminhos , em vez de corresponder a \w*
, seria mais sensível corresponder a [^ ]*
. No entanto , uma vez que você também deseja excluir parte da correspondência, grep
não é a ferramenta certa para o trabalho, a menos que você esteja usando uma versão grep
que suporta PCREs:
printenv LIBS | grep -Po '(^| )-L[^ ]*'
% printenv LIBS | grep -Po '(^| )-L\K/[^ ]*'
/usr/lib
/lib
/usr/lib64
/usr/local/tools/vtk-6.1.0/lib
/g/g92/miguel/petsc-3.6.2/miguel-opt/lib
/usr/local/tools/openmpi-intel-1.8.4/lib
/usr/local/tools/ic-14.0.174/composer_xe_2013_sp1.3.174/compiler/lib/intel64
/usr/lib/gcc/x86_64-redhat-linux/4.4.7
/g/g92/miguel/code/libmesh_2D/lib
No entanto, isso depende dos caminhos que não contêm espaços e confiar nos caminhos que não contêm traços seria igualmente errado.
Geralmente, não há maneira segura de analisar essa string.
Minha sugestão é armazenar os caminhos em um array manualmente.
Pensando duas vezes, eu acho que espaços potenciais em um caminho seriam escapados para que o caminho seja interpretado corretamente?
Se for esse o caso, isso seria seguro:
printenv LIBS | grep -Po '(^| )-L\K\/.*?(?=([^\] |$))'
% export LIBS='-L/path\ with\ spaces -L/another\ path\ with\ spaces'
% printenv LIBS | grep -Po '(^| )-L\K\/.*?(?=([^\] |$))'
/path\ with\ space
/another\ path\ with\ spaces