【问题标题】:how use position for replace a letter如何使用位置替换字母
【发布时间】:2018-10-19 21:03:38
【问题描述】:

代码:

#!/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

那么如何使用我的 var $pos 我可以用读取的字母替换缓存“_”

例子1:我的话是yoyo

我读到了

$pos = 0 2    
cache = y_y_

例子2:我的话是yoyo

我读了一个

$pos = NULL
cache = ____

回显“未找到”

【问题讨论】:

    标签: bash debian


    【解决方案1】:

    您可以使用两种不同的方法:

    1. 在你想要的位置读取字符串

      回显 ${word:$pos:1}

    您将在 $pos 位置回显单词中的一个字符

    1. 将字符串写入您想要的位置

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

    " 很重要,因为您要放置 $pos (只有 ' 会失败)

    由于您的 $pos 中有多个位置,因此您必须一次迭代并更改一个。

    有趣的链接

    【讨论】:

      【解决方案2】:

      假设$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. 在这里,将$pos 的空格替换为end-of-line 字符。
      2. 然后,while循环处理$pos的每个值
      3. 对于每个值,它将$cache 的第n 个字符替换为$letter
      4. 最后,$cache 更新为找到的字母。

      大括号在这里将while循环和最后一个echo放在同一个子shell中,那么这个echo不会丢失$cache值。

      注意:我会说这种方法不是最好的,每次替换我都会调用sed。我们可以为此使用 Bash 内置函数/运算符。

      【讨论】:

      • 当我执行写非整数参数的代码时
      • 我只想要修改我需要的行 pos=$( echo $word | grep -aob ${letter^^} | grep -oE '[0-9]+')
      • 我想研究 mtyvar 单词中的 pos,其中字母是 example:word=mama 我像刽子手一样研究 word 中 m 的 pos
      • 我认为这是错误的 grep -oE '[0-9]+') 我需要修复它,因为使用此命令 pos=$( echo $word | grep -aob ${letter^^ } | grep -oE '[0-9]+') 当我回显不写任何内容的 pos 时
      【解决方案3】:

      这里的意图似乎是创建一个游戏,通过显示猜测字母的位置来显示随机单词。问题中的示例代码所采用的方法是从一串下划线开始,然后用猜测的字母替换下划线。一种更简单的方法是用下划线替换未猜到的字母。这个纯 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-clean,但它没有错误或输入检查,即使对于像这样的微不足道的游戏也没有足够的反馈。

      【讨论】:

      • 我只是想知道如何用 grep 取字母的位置
      • 我不想要一个随机单词我想要我在第 3 行的单词
      • @WilliamBROWAYS,我没有使用grep,因为我认为有更好的方法来解决真正的问题。见What is the XY problem?。对不起,如果我弄错了。
      • @WilliamBROWAYS,问题中的代码 (sort -R $2 | head -1) 从文件中选择了一个随机单词,$3 没有在任何地方使用或提及。此解决方案中的代码可以轻松修改以满足新要求。只需将 myword 赋值行替换为 myword=${words[$3-1]^^}(假设 $3 包含值为 1 或更高的行号)。
      【解决方案4】:

      对于“如何使用我的 var $pos 我可以用读取的字母替换缓存 '_'”尝试:

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

      从某些 cmets 看来,创建 pos 列表可能存在问题。这段代码应该可靠地做到这一点:

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

      pos 值如果不为空,则会有一个前导空格字符,但这不会导致任何问题。对pos 使用数组会更好,但这需要在代码的其他地方进行更改。

      cache 中的letter 设置在与word 相同的位置可以完全不存储位置:

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

      【讨论】:

        猜你喜欢
        • 2017-05-16
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        相关资源
        最近更新 更多