tipos optiweb guitarra ernie electroacustica daddario cuerdas calibre ball string bash scripting

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