Estoy tratando de encontrar una manera de determinar la diferencia entre dos cadenas en mi script. Podría hacer esto fácilmente con diff o comm, pero no estoy tratando con archivos y prefiero no enviarlos a archivos, hacer la comparación y volver a leerlos.
Veo que comm, diff, cmp permiten pasar dos archivos O un archivo y una entrada estándar; supongo que eso es bueno si no quiero generar dos archivos ... pero todavía es un poco horrible.
He estado investigando pensando que puedo usar grep o expresiones regulares, pero supongo que no.
Respuestas:
Usando
diff
ocom
o lo que quieras:Preguntas frecuentes de Greg's Bash: Sustitución de procesos
o con una tubería con nombre
Preguntas frecuentes de Greg's Bash: Trabajar con canalizaciones con nombre
La tubería con nombre también se conoce como FIFO.
El
-
solo es para entrada estándar.<<<
es una "cadena aquí".&
es como;
pero lo pone en segundo planofuente
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
usar la tubería es similar, excepto que muestra un número de proceso, comienza1c1
después del siguiente$
y espera hasta que presione <kbd> Enter <kbd> (o puede hacer otros comandos ...)Me recuerda esta pregunta: ¿Cómo se pueden diferenciar dos pipelines en Bash?
Si está en una sesión de bash, puede hacer lo siguiente:
con la
<
creación de canalizaciones con nombre anónimo, administradas por bash, para que se creen y destruyan automáticamente, a diferencia de los archivos temporales.Entonces, si logra aislar sus dos cadenas diferentes como parte de un comando (grep, awk, sed, ...), puede hacer, por ejemplo, algo como:
(si supone que tiene en su archivo líneas como
string1=very_complicated_value
y unstring2=another_long_and_complicated_value'
: sin conocer el formato interno de su archivo, no puedo recomendar un comando preciso)fuente
Prefiero una
cmp
función de sustitución de proceso de bash:Decir sobre la posición 2, ab ocurre para el primero, pero aq para el segundo. En la posición 5, está sucediendo otra diferencia. Simplemente reemplace esas cadenas por variables y listo.
fuente
Digamos que tienes tres cuerdas
Para eliminar el prefijo b de a
Para eliminar el sufijo c de un
fuente
echo "$a" | sed "s!^$b!!g"
(cambié el separador sed estándar / por! En caso de que las variables que se están tratando sean rutas. Además, podría usar una cadena aquí en lugar de echo:.sed ... <<< $a
)Otro ejemplo:
Salidas
Respuesta original aquí
fuente