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 words
con 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 bash
script 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á Latch
como % 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
Derp
transformación real , es decir, reemplazará todas las palabras espaciales marcadas %
con DerpXX
, XX
siendo 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
Oceans
de "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 sed
script, 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 sed
para hacer tareas como esta. Por otra parte, probablemente tampoco tendría tareas como esta ... :)