String difference in Bash

I'm trying to find a way to determine the difference between two strings in my script. I could easily do this with diff or comm, but I'm not dealing with files and I'd prefer not to output them to files, do the compare and read it back.

I see that comm, diff, cmp all allow to pass either two files OR a file and standard input - I guess that's good if I don't want to output two files...but it's still kinda sucks.

Been digging around thinking I can use grep or regular expressions - but I guess not.


Using diff or com or whatever you want:

diff  <(echo "$string1" ) <(echo "$string2")

Greg's Bash FAQ: Process Substitution

or with a named pipe

mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p

Greg's Bash FAQ: Working with Named Pipes

Named pipe is also known as a FIFO.

The - on its own is for standard input.

<<< is a "here string".

& is like ; but puts it in the background


Reminds me of this question: How can you diff two pipelines in Bash?

If you are in a bash session, you could do a:

diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)

with < creating anonymous named pipes -- managed by bash -- so they are created and destroyed automatically, unlike temporary files.

So if you manage to isolate your two different string as part of a command (grep, awk, sed, ...), you can do - for instance - something like:

diff < grep string1 myFile < grep string2 myFile

(if you suppose you have in your file lines like string1=very_complicated_value and a string2=another_long_and_complicated_value': without knowing the internal format of your file, I can not recommend a precise command)


I prefer cmp and Process Substitution feature of bash:

$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
  2 142 b    161 q
  5 141 a    145 e

Saying on position 2, a b occurs for the first, but a q for the second. At position 5, another difference is happening. Just replace those strings by variables, and you are done.


Say you have three strings

a="this is a line"
b="this is"
c="a line"

To remove prefix b from a

echo ${a#"$b"}  # a line

To remove suffix c from a

echo ${a%"$c"}  # this is