sed: busca y reemplaza el patrón pero excluye una secuencia numérica específica

sed: busca y reemplaza el patrón pero excluye una secuencia numérica específica

Entonces tengo la siguiente declaración que hice:

echo "1234 The few, 7777 the brave." | sed 's/[0-9]\{4\}/(&)/g'

que salidas

(1234) The few, (7777) the brave.

sin embargo, quiero excluir el 7777 de la coincidencia de patrones.

(1234) The few, 7777 the brave.

Pregunta: ¿Cómo excluyo la coincidencia de patrones 7777?

Respuesta1

sed no tiene expresiones de anticipación que le permitirían omitir 7777. Pero podría hacerlo torpemente moviendo todas las coincidencias 7777 "fuera del camino" a alguna cadena que esté seguro de que no aparece en ninguna parte de su entrada.

Por ejemplo, si sabes que #7#7#7#7# no aparece en la entrada, puedes usar:

echo "1234 The few, 7777 the brave." | \
sed -e 's/7777/#7#7#7#7#/g' -e 's/[0-9]\{4\}/(&)/g' -e 's/#7#7#7#7#/7777/g'

Llegar

(1234) The few, 7777 the brave.

Respuesta2

Alternativamente:

echo "1234 The few, 7777 the brave." | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
(1234) The few, 7777 the brave.

echo "A 1717 B 7777 C 7676 D" | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
A (1717) B 7777 C (7676) D

echo "7777 foo 1234 bar" | sed -e 's/\([0-9]\{4\}\)/(\1)/g' -e 's/(\(7\{4\}\))/\1/g'
7777 foo (1234) bar

información relacionada