как использовать позицию для замены буквы - PullRequest
0 голосов
/ 18 октября 2018

код:

#!/bin/bash
word=$( sort -R $2 | head -1 | tr [a-z] [A-Z])
cache=$( echo $word | tr [A-Z] '_')
nb=$( echo $word | wc -m)
nbCar=$( echo $nb -1| bc)
echo "Mystery word: $cache ($nbCar letters)"
echo $word
echo "Enter a letter:"
read -n 1 letter
echo ""
pos=$( echo $word | grep -aob ${letter^^} | grep -oE '[0-9]+')
echo ${letter^^}
echo $pos

так как с моей переменной $pos я могу заменить кэш '_' на букву, прочитанную

пример1: мое слово yoyo

я прочитал y

$pos = 0 2    
cache = y_y_

пример2: мое слово yoyo

я прочитал

$pos = NULL
cache = ____

эхо "Не найдено"

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Для того, как "с помощью моей переменной $ pos я могу заменить кеш '_' на прочитанную букву" try:

for p in $pos ; do
    cache=${cache:0:p}${letter}${cache:p+1}
done

Из некоторых комментариев видно, что могут возникнуть проблемы при создании списка pos,Этот код должен делать это надежно:

pos=
for ((i=0; i<${#word}; i++)) ; do
    [[ ${word:i:1} == "$letter" ]] && pos+=" $i"
done

Значение pos будет иметь начальный пробел, если оно не пустое, но это не должно вызывать никаких проблем.Было бы лучше использовать массив для pos, но это потребовало бы изменений в другом месте кода.

Можно установить letter в cache в тех же позициях, что и в wordбез сохранения позиций вообще:

ncache=
for ((i=0; i<${#word}; i++)) ; do
    [[ ${word:i:1} == "$letter" ]] && ncache+=$letter || ncache+=${cache:i:1}
done
cache=$ncache
0 голосов
/ 18 октября 2018

Предполагая, что $letter содержит "y", $cache уже установлено на "____" и pos на "0 2":

cache=$(echo $pos | tr ' ' '\n' |
        { while read pos
          do pos=$(expr $pos + 1)
          cache=$(echo $cache | sed -e 's/./'"$letter"'/'"$pos")
          done
          echo $cache
         })

Давайте проверим значение:

$ echo $cache
y_y_
  1. Здесь tr заменяет пробелы $pos символом end-of-line.
  2. Затем цикл while обрабатывает каждое значение $pos
  3. для каждогозначение заменяет n-й символ $cache на $letter.
  4. Наконец, $cache обновляется найденной буквой.

Screenshot as proof

Здесь используются фигурные скобки для помещения цикла while и последнего эха в один и тот же подоболочек, тогда это эхо не потеряет значение $cache.

Примечание: Я бы сказал, что этот метод не самый лучший, я звоню sed для каждой замены.Для этого мы могли бы использовать встроенные функции / операторы Bash.

0 голосов
/ 18 октября 2018

Намерение здесь, похоже, состоит в том, чтобы создать игру, в которой случайное слово раскрывается путем отображения позиций угаданных букв.Подход, использованный в примере кода в вопросе, состоит в том, чтобы начать со строки подчеркивания, а затем заменить подчеркивание угаданными буквами.Более простой подход - заменить неугаданные буквы подчеркиванием.Этот чистый код Bash пытается реализовать игру:

#! /bin/bash

declare -r wordsfile=$2

# Read the list of words into an array
mapfile -t words <"$wordsfile"

# Select a random word from the array, and uppercase it
myword=${words[RANDOM%${#words[*]}]^^}

# Set a variable to hold the word with unknown letters replaced by underscores
guessed_word=${myword//?/_}

printf 'Mystery word: %s (%d letters)\n' "$guessed_word" ${#myword}

guessed_letters=    # String containing letters guessed so far
while [[ $guessed_word != "$myword" ]] ; do
    printf 'Enter a letter:'
    read -r -n 1 letter
    printf '\n'

    guessed_letters+=${letter^}

    # Make a glob pattern that matches everything except letters that
    # have been guessed so far.  E.g. 'AB' -> '[^AB]'.
    other_letters_glob="[^$guessed_letters]"

    # Replace everything except guessed letters in the word with underscores
    guessed_word=${myword//$other_letters_glob/_}

    printf 'Mystery word: %s\n' "$guessed_word"
done

Код очищен от Shellcheck, но не имеет ошибок или проверки ввода, а также неадекватных отзывов даже для такой простой игры, как эта.

0 голосов
/ 18 октября 2018

Вы можете использовать два разных подхода:

  1. , чтобы прочитать строку в нужной позиции

    echo $ {word: $ pos: 1}

Вы увидите один символ из слова в позиции $ pos

чтобы записать строку в нужную вам позицию

echo $word | sed "s/./<The character that you want>/$pos"

Важно, когда вы ставите $ pos (только с ', это будет неудачно)

Поскольку у вас есть несколько позиций в вашем $ pos, вам придется повторять и менять по одной за раз.

Интересные ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...