Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String difference in Bash

Tags:

string

bash

People also ask

How do you find the difference between two strings in bash?

What if the string is a single line, and line and there is some difference between the two strings? @alpha_989 , here's your answer: $ 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.

Can you compare strings in bash?

The need to compare strings in a Bash script is relatively common and can be used to check for certain conditions before proceeding on to the next part of a script. A string can be any sequence of characters. To test if two strings are the same, both strings must contain the exact same characters and in the same order.

What does [- Z $1 mean in bash?

$1 means an input argument and -z means non-defined or empty. You're testing whether an input argument to the script was defined when running the script. Follow this answer to receive notifications.


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

Another example:

before="184613 102050 83756 63054"
after="184613 102050 84192 83756 63054"

comm -23 <(tr ' ' $'\n' <<< $after | sort) <(tr ' ' $'\n' <<< $before | sort)

Outputs

84192

Original answer here