Bourne Shell比较两个字符串

时间:2010-11-16 01:09:25

标签: string scripting comparison sh

我需要比较相同固定长度的Bourne shell中的两个字符串。我需要将每个字符与相对字符串中的占位符进行比较,并找出存在多少差异。有没有人对如何解决这个问题有任何建议?

我只是在追逐一些差异,即如果我比较aab& aac的差异将是1。

这也必须是100%的bourne。

6 个答案:

答案 0 :(得分:1)

有很多方法可以实现您所寻求的目标(我知道),但以下代码片段应该可以帮助您开始:

STRING1="test"
STRING2="te5t"

COUNT=0
while [[ $COUNT -lt ${#STRING1}  ]]
do
    POS=$(($COUNT + 1))
    char1=$(echo "${STRING1}" | cut -c $POS)
    char2=$(echo "${STRING2}" | cut -c $POS)
    if [ $char1 != $char2 ]; then
        echo $char1
        echo $char2
    fi

    COUNT=$(($COUNT + 1))
done

答案 1 :(得分:1)

如果您不介意创建临时文件,可以使用cmp方法。使用Bourne shell,您可以做的事情非常有限。我要么使用zsh / bash,要么sh是必不可少的,写一个做我想做的C程序。

如果每次创建文件都是不可能的,你可以创建fifos,但这真的是hackish和丑陋,不要这样做!

mkfifo cmp1
mkfifo cmp2
echo "abcd" > cmp1 &
echo "abce" > cmp2 &
DIFF_CHARS=`cmp -l cmp1 cmp2 | wc -l`

Bash或任何现代shell中的进程替换使得这很简单,我肯定会尝试使用它。

答案 2 :(得分:1)

这是非常纯粹的POSIX shell。它在Dash(作为sh)和BusyBox Ash(作为sh)中运行,并且不使用任何外部实用程序(除非您的shell没有内置printf):

#!/bin/sh
string1="compare"
string2="c0mp4r3"

count=0
while [ -n "$string1" ]
do
    char1=$(printf "%1.1s" "$string1")
    char2=$(printf "%1.1s" "$string2")
    if [ "$char1" != "$char2" ]
    then
        count=$(($count + 1))
    fi
    string1=${string1#$char1}
    string2=${string2#$char2}
done
echo "There are $count differences"

这将在OBG 1 上运行,Heirloom Bourne Shell

#!/usr/local/heirloom-bin/sh
string1="compare"
string2="c0mp4r3"

count=0
while [ -n "$string1" ]
do
    char1=`printf "%1.1s" "$string1"`
    char2=`printf "%1.1s" "$string2"`
    if [ "$char1" != "$char2" ]
    then
        count=`expr $count + 1`
    fi
    string1=`echo "$string1" | cut -c 2-`
    string2=`echo "$string2" | cut -c 2-`
done
echo "There are $count differences"

1 Oldie但Goody Original Bourne Granddaddy

答案 3 :(得分:1)

awk '{gsub(/[^[:alnum:]_[:blank:]]/, "", $0);for (i = 1; i <= NF; i++) {freq[$i]++}} END {for (word in freq){printf "%d\t%s\n", freq[word],word}}' {file} | sort -nr

答案 4 :(得分:0)

这可能是你想要的答案...... Bash string difference

使用cmp比较两个字符串(diff将无法提供您想要的详细程度。)

答案 5 :(得分:0)

出于教育目的,这里是一个纯粹的Bourne(和POSIX)解决方案,没有额外的分支。即使没有COUNT=$((COUNT+1))的任何分支,POSIX shell也可以运行它:

#!/bin/sh

a=$1 b=$2

COUNT=0
while [ -n "$a" ]; do
  [ "${a%${a#?}}" != "${b%${b#?}}" ] && COUNT=`expr $COUNT + 1`
  a=${a#?} b=${b#?}
done
echo COUNT=$COUNT

让我们在OP的字符串上运行:

$ ./x.sh aab aac
COUNT=1