String 如何更改/覆盖字符串中的某些字符?
我在bash中有一个“绞刑人”类型的游戏。这是目前正在工作,但我只是无法得到我的头如何覆盖字符串中的某些字符 因此,目前我从用户那里收到一封信(例如“l”),它会根据字符串“hello”检查它,并打印为“uul l”(代码中的“{isString 如何更改/覆盖字符串中的某些字符?,string,bash,text,String,Bash,Text,我在bash中有一个“绞刑人”类型的游戏。这是目前正在工作,但我只是无法得到我的头如何覆盖字符串中的某些字符 因此,目前我从用户那里收到一封信(例如“l”),它会根据字符串“hello”检查它,并打印为“uul l”(代码中的“{is$prev”),我希望当用户输入“e”时,$prev会更新为“e l\uu”,等等,以表示“h”和“o” Q:如何更改字符串中的某个字符?如果要操作变量中的单个字符,则更容易保存数组中的所有字符。这样,您可以根据数组索引更改字符。下面显示了在操作cha时从数组转换到
$prev
”),我希望当用户输入“e”时,$prev
会更新为“e l\uu”,等等,以表示“h”和“o”
Q:如何更改字符串中的某个字符?如果要操作变量中的单个字符,则更容易保存数组中的所有字符。这样,您可以根据数组索引更改字符。下面显示了在操作cha时从数组转换到数组的简单方法注意:不需要转换回变量,您只需在数组中保持猜测的单词:
#!/bin/bash
declare -a array
prev="__||_" ## previous state of guessing
printf "%s\n" "$prev"
for ((i=0; i<${#prev}; i++)); do ## convert to array
array+=( ${prev:i:1} )
done
array[1]="e" ## update letter
## convert back to string
printf -v prev $(echo ${array[@]} | tr -d ' ')
printf "%s\n" "$prev"
如果要操作变量中的单个字符,则更容易保存数组中的所有字符。这样,您可以根据数组索引更改字符。下面显示了在操作字符时转换为数组或从数组转换的简单方法。注意:无需转换回变量,只需维护在数组中猜测的e字:
#!/bin/bash
declare -a array
prev="__||_" ## previous state of guessing
printf "%s\n" "$prev"
for ((i=0; i<${#prev}; i++)); do ## convert to array
array+=( ${prev:i:1} )
done
array[1]="e" ## update letter
## convert back to string
printf -v prev $(echo ${array[@]} | tr -d ' ')
printf "%s\n" "$prev"
hangman的一种实现,它使用数组表示单词和答案。它从${words}指向的文件中随机选取一个单词
#!/usr/bin/env bash
words='/usr/share/dict/words'
die() { >&2 echo $@; exit 1; }
join() { local IFS="$1"; shift; echo "$*"; }
new_word() {
unset word
local length=$(wc -l < ${words})
local count=$((${RANDOM} % ${length}))
head -${count} ${words} | tail -1 | tr '[:upper:]' '[:lower:]'
}
draw_hangman() {
# draw hangman here
((++guesses))
}
[[ -f ${words} ]] || die "Missing words file: ${words}"
declare -i guesses=0
declare -a word=( $(new_word | grep -o .) )
declare -a answer=( $(printf '_ %.0s' $(seq 1 ${#word[@]})) )
while :; do
echo -e "\nPress - to quit.\n"
echo -e "${answer[@]}\n"
read -s -n 1 -p "$((${#word[@]} - ${guesses})) more guesses: " guess
echo
[[ ${guess} == '-' ]] && echo && break # quit
[[ ${guesses} -eq $((${#word[@]} - 1)) ]] && echo -e "\nYOU LOSE!\n" && \
echo "The word was $(join '' ${word[@]})" && break
[[ ${word[@]} != *${guess}* ]] && draw_hangman && continue
for i in ${!word[@]}; do
[[ ${word[${i}]} == ${guess} ]] && answer[${i}]=${guess}
done
[[ ${answer[@]} == ${word[@]} ]] && echo -e "\nYOU WIN!\n" && break
done
!/usr/bin/env bash
words='/usr/share/dict/words'
die(){>&2 echo$@;退出1;}
join(){local IFS=“$1”shift;echo“$*”;}
新词{
未置词
本地长度=$(wc-l<${words})
本地计数=$(${RANDOM}%${length}))
head-${count}${words}|tail-1 | tr'[:上限:''[:下限:''
}
draw_hangman(){
#在这里画刽子手
(+++猜测)
}
[[-f${words}]| | die“缺少单词文件:${words}”
declare-i猜测=0
declare-a-word=($(新单词| grep-o.))
声明-a答案=($(printf'.%.0s'$(seq 1${单词[@]})))
当:;做
echo-e“\n按-退出。\n”
echo-e“${answer[@]}\n”
阅读-s-n1-p“$(${{单词[@]}-${猜测])更多猜测:“猜测
回声
[${guess}='-']&&echo&&break#退出
[${guesses}-eq$(${word[@]}-1))]&&echo-e“\n你输了!\n”&&\
echo“单词是$(加入'${word[@]})”&&break
[[${word[@]}!=*${guess}*]&&draw\u hangman&&continue
因为${!word[@]};中的i
[${word[${i}]}=${guess}]]&&answer[${i}]=${guess}
完成
[[${answer[@]}==${word[@]}]]]&&echo-e“\n您赢了!\n”&&break
完成
hangman的一种实现,它使用数组来表示单词和答案。它从${words}指向的文件中随机选取一个单词
#!/usr/bin/env bash
words='/usr/share/dict/words'
die() { >&2 echo $@; exit 1; }
join() { local IFS="$1"; shift; echo "$*"; }
new_word() {
unset word
local length=$(wc -l < ${words})
local count=$((${RANDOM} % ${length}))
head -${count} ${words} | tail -1 | tr '[:upper:]' '[:lower:]'
}
draw_hangman() {
# draw hangman here
((++guesses))
}
[[ -f ${words} ]] || die "Missing words file: ${words}"
declare -i guesses=0
declare -a word=( $(new_word | grep -o .) )
declare -a answer=( $(printf '_ %.0s' $(seq 1 ${#word[@]})) )
while :; do
echo -e "\nPress - to quit.\n"
echo -e "${answer[@]}\n"
read -s -n 1 -p "$((${#word[@]} - ${guesses})) more guesses: " guess
echo
[[ ${guess} == '-' ]] && echo && break # quit
[[ ${guesses} -eq $((${#word[@]} - 1)) ]] && echo -e "\nYOU LOSE!\n" && \
echo "The word was $(join '' ${word[@]})" && break
[[ ${word[@]} != *${guess}* ]] && draw_hangman && continue
for i in ${!word[@]}; do
[[ ${word[${i}]} == ${guess} ]] && answer[${i}]=${guess}
done
[[ ${answer[@]} == ${word[@]} ]] && echo -e "\nYOU WIN!\n" && break
done
!/usr/bin/env bash
words='/usr/share/dict/words'
die(){>&2 echo$@;退出1;}
join(){local IFS=“$1”shift;echo“$*”;}
新词{
未置词
本地长度=$(wc-l<${words})
本地计数=$(${RANDOM}%${length}))
head-${count}${words}|tail-1 | tr'[:上限:''[:下限:''
}
draw_hangman(){
#在这里画刽子手
(+++猜测)
}
[[-f${words}]| | die“缺少单词文件:${words}”
declare-i猜测=0
declare-a-word=($(新单词| grep-o.))
声明-a答案=($(printf'.%.0s'$(seq 1${单词[@]})))
当:;做
echo-e“\n按-退出。\n”
echo-e“${answer[@]}\n”
阅读-s-n1-p“$(${{单词[@]}-${猜测])更多猜测:“猜测
回声
[${guess}='-']&&echo&&break#退出
[${guesses}-eq$(${word[@]}-1))]&&echo-e“\n你输了!\n”&&\
echo“单词是$(加入'${word[@]})”&&break
[[${word[@]}!=*${guess}*]&&draw\u hangman&&continue
因为${!word[@]};中的i
[${word[${i}]}=${guess}]]&&answer[${i}]=${guess}
完成
[[${answer[@]}==${word[@]}]]]&&echo-e“\n您赢了!\n”&&break
完成
由于您使用的是bash,因此将每个字符作为数组元素保存可以分别对每个字符进行索引/更改,而不是将单词保存在字符串中。由于您使用的是bash,因此将每个字符作为数组元素保存可以对每个字符进行索引/更改个别地。