Tengo un código fuente distribuido en varios archivos.
- Tiene un patrón con el
abcdef
que necesito reemplazarpqrstuvxyz
. - El patrón podría ser
Abcdef
(Sentence Case) y luego debe ser reemplazado porPqrstuvxyz
. - El patrón podría ser
AbCdEf
(caso de alternar) y luego debe ser reemplazado porPqRsTuVxYz
.
En resumen, necesito hacer coincidir el caso del patrón de origen y aplicar el patrón de destino apropiado.
¿Cómo puedo lograr esto usando sed
o cualquier otra herramienta?
text-processing
sed
awk
usuario1263746
fuente
fuente
ABcDeF
?ABcDeF
->PQrStUvxyz
, entonces seguramenteAbCdEf
->PqRsTuvxyz
sería lógicamente consistente. Si el caso se va a copiar de una cadena a la otra, ¿qué debería suceder si la segunda cadena de reemplazo es más larga?Respuestas:
Solución portátil con
sed
:Es un poco más fácil con GNU sed:
Al usar lo
&&&
anterior, reutilizamos el patrón de mayúsculas y minúsculas de la cadena para el resto del reemplazo, por loABcdef
que se cambiaría aPQrstuVWx
yAbCdEf
porPqRsTuVwX
. Cambie a&
para afectar solo el caso de los primeros 6 caracteres.(tenga en cuenta que puede no hacer lo que desea o puede encontrarse con un bucle infinito si el reemplazo puede estar sujeto a sustitución (por ejemplo, si se sustituye
foo
porfoo
, obcd
porabcd
)fuente
Solución portátil con
awk
:Entrada de ejemplo:
Salida de ejemplo:
Actualizar
Como se señaló en los comentarios, lo anterior solo reemplazará la primera instancia de
find
cada línea. Para reemplazar todas las instancias:Entrada de ejemplo:
Salida de ejemplo:
fuente
Podrías usar
perl
. Directamente de las preguntas frecuentes - citandoperldoc perlfaq6
:¿Cómo puedo sustituir mayúsculas y minúsculas en el LHS mientras se preserva el caso en el RHS?
Aquí hay una hermosa solución Perlish de Larry Rosler. Explota las propiedades de bit xor en cadenas ASCII.
Y aquí está como una subrutina, modelada a partir de lo anterior:
Esto imprime:
Como alternativa, para mantener el caso de la palabra de reemplazo si es más larga que la original, puede usar este código, por Jeff Pinyan:
Esto cambia la oración a "este es un caso de ÉXITO".
Solo para mostrar que los programadores de C pueden escribir C en cualquier lenguaje de programación, si prefiere una solución más similar a C, el siguiente script hace que la sustitución tenga el mismo caso, letra por letra, que el original. (También sucede que se ejecuta aproximadamente un 240% más lento que la solución Perlish). Si la sustitución tiene más caracteres que la cadena que se sustituye, el caso del último carácter se utiliza para el resto de la sustitución.
fuente
Si recorta el reemplazo para
pqrstu
, intente esto:Entrada:
Ouput:
Si desea reemplazar con
prstuvxyz
, puede ser esto:No puedo encontrar ninguna regla para mapear
ABcDeF
->PQrStUvxyz
.fuente
Algo como esto haría lo que describiste.
fuente