Parece que sed que viene con Mac OS 1.7.4 es el original, sin el +
metacharacter. ¿Puedo obtener la funcionalidad +
metacharacter?
Parece que sed que viene con Mac OS 1.7.4 es el original, sin el +
metacharacter. ¿Puedo obtener la funcionalidad +
metacharacter?
El +
es una extensión GNU de sed
que coincide con uno o más de la expresión anterior, pero la versión en OS X es BSD sed
. Se ha portado una versión de GNU sed
a OS X en MacPorts . De lo contrario, tendrá que intentar una solución.
Por ejemplo, para hacer coincidir uno o más dígitos, puedes usar [0-9][0-9]*
en lugar de [0-9]+
La implementación de sed
de OS X utiliza el formato de expresión regular "básico" de forma predeterminada, que no admite +
. De 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. The
parentheses for nested subexpressions are '\(' and '\)', with '(' and ')'
by themselves ordinary characters. [...]
Entonces, ¿qué puedes hacer? Bueno, una posibilidad es decirle a sed
que use el formato moderno con el interruptor -E
. Sin embargo, esto puede forzarle a reescribir otras partes de su RE para que se ajusten (por ejemplo, intercambiar \( ... \)
con ( ... )
). Otra opción es usar uno de los formularios alternativos sugeridos anteriormente. Aquí hay ejemplos que usan los diversos enfoques para hacer coincidir "A" seguido de uno o más "B" o "C", seguido de "D":
sed -E 's/A[BC]+D/[match]/'
sed 's/A[BC]\{1,\}D/[match]/'
sed 's/A[BC][BC]*D/[match]/'