Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Bourne Shell比较两个字符串_String_Scripting_Comparison_Sh - Fatal编程技术网

String Bourne Shell比较两个字符串

String Bourne Shell比较两个字符串,string,scripting,comparison,sh,String,Scripting,Comparison,Sh,我需要比较Bourne shell中相同固定长度的两个字符串。我需要将每个字符与另一个字符串中的占位符进行比较,找出有多少差异。有没有人对此有什么建议 我只是在寻找一种差异数量的方法,即如果我比较aab和aac,差异将为1 这也必须是100%伯恩。这可能是您想要的答案 使用cmp比较两个字符串(diff不会提供您想要的详细程度。)这可能是您想要的答案 使用cmp来比较这两个字符串(diff不会提供您想要的详细程度。)有很多方法可以实现您的搜索(据我所知),但下面的代码片段应该可以让您开始: ST

我需要比较Bourne shell中相同固定长度的两个字符串。我需要将每个字符与另一个字符串中的占位符进行比较,找出有多少差异。有没有人对此有什么建议

我只是在寻找一种差异数量的方法,即如果我比较aab和aac,差异将为1


这也必须是100%伯恩。

这可能是您想要的答案


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

这可能是您想要的答案


使用
cmp
来比较这两个字符串(
diff
不会提供您想要的详细程度。)

有很多方法可以实现您的搜索(据我所知),但下面的代码片段应该可以让您开始:

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

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

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

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

如果每次都创建文件是不可能的,那么您可以创建FIFO,但这真的是太粗糙和丑陋了,不要这样做

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

Bash或任何现代shell中的进程替换都会使这个问题变得微不足道,我一定会尝试使用它。

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

如果每次都创建文件是不可能的,那么您可以创建FIFO,但这真的是太粗糙和丑陋了,不要这样做

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

Bash或任何现代shell中的进程替换都会使这个问题变得微不足道,我肯定会尝试使用它。

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

这将在OBG1上运行,即:


1古董但古董或原创伯恩爷爷

这是非常纯的POSIX外壳。它在破折号(as
sh
)和BusyBox-Ash(as
sh
)中运行,并且不使用外部实用程序(除非您的shell没有内置的
printf
):

这将在OBG1上运行,即:


1古董古董或原创伯恩爷爷出于教育目的,这里有一个纯伯恩(和POSIX)解决方案,没有额外的叉子。POSIX Shell甚至可以在没有任何分叉的情况下使用
COUNT=$((COUNT+1))
运行此功能:

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

$ ./x.sh aab aac
COUNT=1

出于教育目的,这里有一个纯Bourne(和POSIX)解决方案,没有额外的分叉。POSIX Shell甚至可以在没有任何分叉的情况下使用
COUNT=$((COUNT+1))
运行此功能:

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

$ ./x.sh aab aac
COUNT=1

awk'{gsub(/[^[:alnum:][:blank:][]/,“”,$0);for(i=1;i
awk'{gsub(/[^[:alnum:][:blank:][]/,“”,$0);for(i=1;我知道如何在Bourne shell中提取每个字符抱歉不能有任何bash。我已经更新了上面的代码示例。目前我只有bash可用,但代码通过了bash的Bourne shell兼容性。Bourne shell中没有双方括号。我知道如何在Bourne shell中提取每个字符抱歉不能有任何bash。我已经更新了上面的代码示例。我现在只有bash可用,但代码通过了bash的Bourne shell兼容性。Bourne shell中没有双方括号。你必须在Bourne而不是bash中进行此操作。这是一个什么样的过时系统?@Mark Thomas:什么样的程序员会这样做当bourne解决方案起作用时使用bash?当有zsh时,谁还在使用bash?看,这都是偏好的问题,你习惯了什么,或者你的操作系统配备了什么。你必须在bourne而不是bash中这样做?这是什么样的过时系统?@Mark Thomas:当bourne解决方案起作用时,什么样的程序员会使用bash诀窍是什么?有zsh的时候谁还在使用bash?看,这都是偏好的问题,你习惯了什么,或者你的操作系统配备了什么。
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