Como fazer o + funcionar no regexps do sed no FreeBSD?

1

Considere o seguinte texto datilografado:

$ freebsd-version
10.0-RELEASE-p5
$ echo ' found' | sed -n '/[[:blank:]]\+/p'
$ echo ' found' | grep '[[:blank:]]\+'
 found

Quando faço isso no Arch Linux com o GNU sed :

$ echo ' found' | sed -n '/[[:blank:]]\+/p'
 found
$ echo ' found' | grep '[[:blank:]]\+'
 found

Estou fazendo errado? Por que não funciona no FreeBSD? Como fazer isso funcionar?

    
por x-yuri 30.09.2015 / 21:56

2 respostas

0

tl; dr consulte a solução do fd0

Eu olhei na página man antes de perguntar, mas não consegui perceber a informação relevante, já que percebi que ela não difere significativamente da dos Linuxes. Mas,

$ man sed
...
 -E      Interpret regular expressions as extended (modern) regular
         expressions rather than basic regular expressions (BRE's).  The
         re_format(7) manual page fully describes both formats.
$ man re_format
...
 Obsolete (“basic”) regular expressions differ in several respects.  ‘|’
 is an ordinary character and there is no equivalent for its functional‐
 ity.  ‘+’ and ‘?’ are ordinary characters, and their functionality can be
 expressed using bounds (‘{1,}’ or ‘{0,1}’ respectively).  Also note that
 ‘x+’ in modern REs is equivalent to ‘xx*’.  The delimiters for bounds are
 ‘\{’ and ‘\}’, with ‘{’ and ‘}’ by themselves ordinary characters.

E tentei usar {1,} , apenas esqueci de sair de chaves. Então, certamente a solução do fd0 é geralmente a melhor maneira possível. Mas outros seriam:

$ echo ' found' | sed -n '/[[:blank:]]\{1,\}/p'
 found
$ echo ' found' | sed -n '/[[:blank:]][[:blank:]]*/p'
 found

No entanto, não tenho certeza do que eles queriam dizer com

Also note that ‘x+’ in modern REs is equivalent to ‘xx*’

Ou seja, como era em não-modernos.

Além disso, a página de manual grep não mencionou re_format entry, o que aparentemente significa que possui sua própria implementação de expressões regulares. Por falar nisso, era% GNUgrep, em oposição a sed .

    
por 01.10.2015 / 08:41
4

Com o BSD sed você precisa ativar o ERE com a opção E .

echo '  found' | sed -nE '/[[:blank:]]+/p'
    
por 30.09.2015 / 22:23