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 ... :)