string - optiweb - Diferencia de cuerdas
ernie ball (4)
Digamos que tienes tres cuerdas
a="this is a line"
b="this is"
c="a line"
Para eliminar el prefijo b de una
echo ${a#"$b"} # a line
Para eliminar el sufijo c de una
echo ${a%"$c"} # this is
Estoy tratando de encontrar una forma 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 preferiría no sacarlos a los archivos, hacer la comparación y leerlos de nuevo.
Veo que comm, diff, cmp permiten pasar dos archivos O un archivo y una entrada estándar, supongo que es bueno si no quiero generar dos archivos ... pero sigue siendo una mierda.
He estado cavilando pensando que puedo usar grep o expresiones regulares, pero supongo que no.
Gracias por adelantado,
Me recuerda a esta pregunta: ¿Cómo se pueden dividir dos tuberías en Bash?
Si estás en una sesión de bash, podrías hacer un:
diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)
con <
creación de conductos anónimos con nombre, administrados por bash, por lo que se crean y destruyen automáticamente, a diferencia de los archivos temporales.
Entonces, si logras aislar tus dos cadenas diferentes como parte de un comando (grep, awk, sed, ...), puedes hacer, por ejemplo, algo así como:
diff < grep string1 myFile < grep string2 myFile
(si usted supone que tiene en su archivo líneas como string1=very_complicated_value
y una string2=another_long_and_complicated_value''
: sin conocer el formato interno de su archivo, no puedo recomendar un comando preciso)
Prefiero la función cmp
y la función de sustitución de procesos de bash:
$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
2 142 b 161 q
5 141 a 145 e
Diciendo en la posición 2, ab ocurre para la primera, pero aq para la segunda. En la posición 5, está ocurriendo otra diferencia. Simplemente reemplace esas cadenas por variables, y listo.
Usando diff
o com
o lo que quieras:
diff <(echo "$string1" ) <(echo "$string2")
Preguntas frecuentes sobre Greg''s Bash: Sustitución de procesos
o con un tubo con nombre
mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p
Preguntas frecuentes sobre Greg''s Bash: Trabajar con tuberías con nombre
La tubería con nombre también se conoce como FIFO.
El -
por sí solo es para entrada estándar.
<<<
es una "cadena aquí".
&
es como ;
pero lo pone en segundo plano