String Bourne Shell比较两个字符串
我需要比较Bourne shell中相同固定长度的两个字符串。我需要将每个字符与另一个字符串中的占位符进行比较,找出有多少差异。有没有人对此有什么建议 我只是在寻找一种差异数量的方法,即如果我比较aab和aac,差异将为1String Bourne Shell比较两个字符串,string,scripting,comparison,sh,String,Scripting,Comparison,Sh,我需要比较Bourne shell中相同固定长度的两个字符串。我需要将每个字符与另一个字符串中的占位符进行比较,找出有多少差异。有没有人对此有什么建议 我只是在寻找一种差异数量的方法,即如果我比较aab和aac,差异将为1 这也必须是100%伯恩。这可能是您想要的答案 使用cmp比较两个字符串(diff不会提供您想要的详细程度。)这可能是您想要的答案 使用cmp来比较这两个字符串(diff不会提供您想要的详细程度。)有很多方法可以实现您的搜索(据我所知),但下面的代码片段应该可以让您开始: ST
这也必须是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(assh
)中运行,并且不使用外部实用程序(除非您的shell没有内置的printf
):
这将在OBG1上运行,即:
1古董但古董或原创伯恩爷爷这是非常纯的POSIX外壳。它在破折号(as
sh
)和BusyBox-Ash(assh
)中运行,并且不使用外部实用程序(除非您的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;iawk'{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