2010-07-11 3 views
2

Compte tenu de ces deux chaînes:de script Bash différence Rechercher entre deux chaînes

"12345" 
"1245" 

Lorsque le premier est la chaîne complète et la seconde a des choses qui manquent dans la première, je veux qu'il revienne « 3 ».

Encore une fois avec:

"The ball is red" 
"The is red" 

Je veux revenir "balle"

J'ai essayé avec diff:

diff <(echo "12345") <(echo "1245") 

Mais diff ne donne pas la sortie désirée . comm ne fait pas ce que je veux non plus.

Répondre

3

Je pense que comm est la commande correcte:

comm -23 <(tr ' ' $'\n' <<< 'The ball is red') <(tr ' ' $'\n' <<< 'The is red') 

ou plus souple:

split_spaces() { tr ' ' $'\n' <<< "$1"; } 
split_chars() { sed $'s/./&\\\n/g' <<< "$1"; } 
comm -23 <(split_spaces 'The ball is red') <(split_spaces 'The is red') 
comm -23 <(split_chars 12345) <(split_chars 1245) 
1

En utilisant un seul exécutable externe:

a='The ball is red' 
b='The is red' 
join -v 1 <(echo "${a// /$'\n'}") <(echo "${b// /$'\n'}") 

En utilisant join et grep sur les chaînes sans espaces:

a=12345 
b=1245 
join -v 1 <(echo "$a" | grep -o .) <(echo "$b" | grep -o .) 
Questions connexes