Parece que el sed que viene con Mac OS 1.7.4 es el original, sin el +
metacaracterística. ¿Puedo tener el +
funcionalidad de los metacaracteres?
Respuestas
¿Demasiados anuncios?La implementación de OS X de sed
utiliza el formato "básico" de expresión regular por defecto, que no soporta +
. 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
para usar el formato moderno con el -E
interruptor. Sin embargo, esto puede obligarle a reescribir otras partes de su RE para conformarse (por ejemplo, intercambiando \( ... \)
con ( ... )
). Otra opción es utilizar una de las formas alternativas sugeridas anteriormente. A continuación se presentan ejemplos en los que se utilizan los distintos enfoques para hacer coincidir "A" con una o más "B" o "C", seguidas de "D":
sed -E 's/A[BC]+D/[match]/'
sed 's/A[BC]\{1,\}D/[match]/'
sed 's/A[BC][BC]*D/[match]/'
El +
es un Extensión GNU de sed
que coincide con una o más de las expresiones anteriores, pero la versión en OS X es BSD sed
. Una versión de GNU sed
se ha portado a OS X en MacPorts . De lo contrario, tendrás que intentar una solución alternativa.
Por ejemplo, para hacer coincidir uno o más dígitos, podrías usar [0-9][0-9]*
en lugar de [0-9]+