두 문자열을 비교한 후 남은 문자

두 문자열을 비교한 후 남은 문자

저는 현재 사용자 입력과 컴퓨터 입력을 비교하는 bash 게임을 작성 중입니다.

두 문자열을 비교한 후 남은 문자를 찾고 싶습니다. 내 생각은 다음과 같습니다.

user_word='hello' 

computer_word='bxolq' 

compare  ${user_word} ${computer_word} 

compare function: (finds "l" to be equal in the two strings)

calculate leftover word for user (= "heo") 

calculate leftover word for computer (= "bxoq")

"bxoq"이제 길이가 4이고 사용자의 남은 개수가 3이므로 컴퓨터가 승리합니다 "heo".

이 문제를 해결 하려고 노력했지만 diff결과는

diff <(echo ${user_word} | sed 's:\(.\):\1\n:g' | sort) <(echo ${computer_word} | sed 's:\(.\):\1\n:g' | sort)

나를 혼란스럽게 한다.

그래서 내 질문은: 나머지 비교를 어떻게 완료할 수 있습니까?

답변1

셸 에서는 문자를 제거하려는 문자열이 어디에 있고 제거하려는 특정 문자 집합이 어디에 있는지를 bash사용하여 문자열의 문자 집합 내에서 발생하는 모든 문자를 제거할 수 있습니다 . 세트는 문자 세트의 한 문자와 일치 하는 또는 유사한 일반 쉘 패턴 대괄호 표현식입니다.${variable//[set]/}variable[set][abcd][a-g0-5]

바꾸기는 bash세트의 모든 문자를 일치시키고 아무것도 없는 문자로 바꿉니다(즉, 삭제).

코드에서 이를 사용하여 한 문자열에 있는 모든 문자를 다른 문자열에서 제거하거나 그 반대로 제거할 수 있습니다.

$ user_word='hello' comp_word='bxolq'
$ echo "${user_word//["$comp_word"]/}"
he
$ echo "${comp_word//["$user_word"]/}"
bxq

다음으로 사용할 함수는 확장으로 ${#variable}, 변수에 저장된 문자열의 문자 수를 알려줍니다 variable.

$ short_user_word=${user_word//["$comp_word"]/}; suw_len=${#short_user_word}
$ short_comp_word=${comp_word//["$user_word"]/}; scw_len=${#short_comp_word}
$ if [ "$scw_len" -lt "$suw_len" ]; then echo 'User won'; elif [ "$scw_len" -gt "$suw_len" ]; then echo 'Computer won'; else echo 'It is a draw'; fi
Computer won

인수에서 두 단어를 가져오는 스크립트:

#!/bin/bash

user_word=$1
comp_word=$2

short_user_word=${user_word//["$comp_word"]/}; suw_len=${#short_user_word}
short_comp_word=${comp_word//["$user_word"]/}; scw_len=${#short_comp_word}

if [ "$scw_len" -lt "$suw_len" ]; then
    echo 'User won'
elif [ "$scw_len" -gt "$suw_len" ]; then
    echo 'Computer won'
else
    echo 'It is a draw'
fi

관련 정보