reemplazar todos los nombres con una alternativa usando Stream editor (Sed)


2

Tengo esta pregunta en una tarea. Nada funciona. ¿Alguien puede ayudarme?

Escriba un script sed que reemplace todos los nombres con una alternativa,

busca todas las palabras que:

  • Comience con una capital,
  • Más de dos letras
  • Donde hay un espacio en blanco frente a él y
  • El carácter antes del espacio en blanco no es una puntuación que termina una oración.

Reemplace esas palabras en "Derp" + los dos últimos caracteres de la palabra.


¿Puede dar un ejemplo de la acción deseada? ¿Y también puedes incluir lo que ya has probado?
Eugene S

Respuestas:


1

Esto es bastante incómodo de hacer en sed, pero aquí hay una versión que puede funcionar siempre que haya un personaje (elegí %) que nunca aparecerá en la entrada. El personaje se usa para marcar.

Digamos que tiene un archivo de texto llamado wordscon los siguientes contenidos:

Will He beat Sit Down Boy Oh Not now Latch Wi, Qq or Spat? GNU Hurd, protocols on GNU Mach. The Hurd versus Unix.

El siguiente bashscript hará el trabajo:

cat words
sed 's/ [A-Z][A-Za-z]*[A-Za-z]\{2\}/%&/g' words|tee a
sed 's/\([.!?]\)%/\1/g' a|tee b
sed 's/% [A-Za-z]*\([A-Za-z]\{2\}\)/ Derp\1/g' b|tee c

El resultado de lo anterior será (separé cada uno por una nueva línea):

Will He beat Sit Down Boy Oh Not now Latch Wi, Qq or Spat? GNU Hurd, protocols on GNU Mach. The Hurd versus Unix.

Will He beat% Sit% Down% Boy Oh% Not now% Latch Wi, Qq or% Spat?% GNU% Hurd, protocols on% GNU% Mach.% The% Hurd versus% Unix.

Will He beat% Sit% Down% Boy Oh% Not now% Latch Wi, Qq or% Spat? GNU% Hurd, protocols on% GNU% Mach. The% Hurd versus% Unix.

Will He beat Derpit Derpwn Derpoy Oh Derpot now Derpch Wi, Qq or Derpat? GNU Derprd, protocols on DerpNU Derpch. The Derprd versus Derpix.

Así es como funciona:

  • La primera línea simplemente imprime el archivo, para que vea la posición inicial.
  • La segunda línea marca todas las palabras en mayúscula que están precedidas por un espacio y tienen más de 2 caracteres %. Por lo tanto, por ejemplo, se marcará Latchcomo % Latch. Tenga en cuenta el espacio, llamaré a esta palabra espacial.
  • La tercera línea se eliminará la marca de todos los espacios-palabras que vienen precedidos por un carácter final de una frase (por simplicidad, he elegido únicamente ., !o ?- se puede añadir otros, como ), o como si es necesario)
  • La tercera línea realizará una Derptransformación real , es decir, reemplazará todas las palabras espaciales marcadas %con DerpXX, XXsiendo los dos últimos caracteres de esa palabra espacial.

Tenga en cuenta que hay tecnicismos que no se abordaron aquí, como:

  • Esto funcionará solo para palabras ASCII de EE. UU. (Por ejemplo, no funcionará para todas las palabras en francés, como Être)
  • Otros personajes que tenga que ser considerado (por ejemplo, es Oceansde "Oceans Eleven"considerar una palabra a pesar de que tiene "delante?)
  • No funcionará para espacios en blanco que no sean espacios (por ejemplo, pestañas)

y así.

Para que sea puramente un sedscript, solo concatena:

sed '
s/ [A-Z][A-Za-z]*[A-Za-z]\{2\}/%&/g
s/\([.!?]\)%/\1/g
s/% [A-Za-z]*\([A-Za-z]\{2\}\)/ Derp\1/g
' words

Obviamente, en el mundo real, no usaría sedpara hacer tareas como esta. Por otra parte, probablemente tampoco tendría tareas como esta ... :)


Gracias ! Funcionó ! Mi respuesta a esa pregunta fue incorrecta porque solo busqué [AZ] ... ¡Gracias!
Jleeeeny

Claro, me alegro de que funcionó!
icyrock.com

@Jleeeeny: Bienvenido a Super User, considera votar y aceptar las respuestas que te ayudaron. Puede hacerlo con la flecha hacia arriba sobre el número de voto, así como la marca de aceptación debajo de los controles de votación. De esta manera, tanto la persona que lo ayudó como usted mismo recibirán reputación. Consulte también la versión más corta de potong.
Tamara Wijsman

0

Esto podría funcionar para usted:

sed ':a;s/\([^.!?] \)[A-Z][A-Za-z]*\([A-Za-z]\{2\}\)\>/\1\nDerp\2/;ta;s/\n//g' file

¡Bienvenido a Super User! Tenga en cuenta que la otra respuesta tiene un comentario que ayudó. ¿Qué hace tu versión diferente / mejor? ¿Podrías dar más detalles sobre las diferencias?
Tamara Wijsman

1
Pero ahora solo cambia el apellido. Entonces, cuando hay un apellido y un apellido, solo cambia el apellido en derp + 2 caracteres. ¿Cómo puedo cambiar también el apellido, en herp + 2caracteres? Pensé en la misma cadena de búsqueda, pero eso no funcionó ...
Jleeeeny

@Jleeeeny faciliten datos de prueba
Potong

@potong lo tengo! :) pero gracias por tu ayuda
Jleeeeny
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.