【问题标题】:How can I look up each character in each line in a file as a variable name?如何将文件中每一行中的每个字符作为变量名查找?
【发布时间】:2017-10-31 22:50:33
【问题描述】:

在 bash 脚本中,我设置了一些像这样的变量

A=1
B=2

我有一个名为 list.txt 的文本文件,其中包含

AAB
ABA
BBA

在我的脚本中我也有

while read LINE
do
    echo "$LINE" | grep -o .
    echo "----"
done < list.txt

我的输出是

A
A
B
----
A
B
A
----
B
B
A
----

我将如何将其作为我的输出?

112
----
121
----
221
----

【问题讨论】:

  • 顺便说一句,这并不是一个真正理想的问题——如果你将其范围缩小到一次只问一件事,我们已经知道任何事情的副本“一件事”可能是。如何逐个字符地遍历一行,例如,我们已经有了;如何将变量名查找到变量所具有的值,我们已经有了;如何逐行读取文件或流式传输,我们已经有了......等
  • 你能做类似tr 'AB' $(echo "$A$B") &lt; list.txt的事情,跳过中间行(你可以用| sed 's/$/\n----/添加)吗?你怎么知道哪些变量需要用于替换?
  • @WalterA, ...当然,上面假设替换值每个只能是一个字符。

标签: bash loops variables


【解决方案1】:
A=1
B=2
while IFS= read -r line; do
  for ((idx=0; idx < ${#line}; idx++)); do
    char=${line:$idx:1}
    val=${!char}
    printf '%s' "$val"
  done
  printf '%s\n' '' ----
done <<<$'AAB\nABA\nBBA'

...正确地作为输出发出:

112
----
121
----
221
----

【讨论】:

    【解决方案2】:

    替代 bash + awk 解决方案:

    #!/bin/bash
    
    A=1
    B=2
    awk -v A="$A" -v B="$B" 'BEGIN{ keys["A"]=A; keys["B"]=B }
           { len=split($0,a,"");
           for (i=1;i<=len;i++) printf "%s%s", keys[a[i]], (i==len? "\n---\n":"") }' list.txt
    

    输出:

    112
    ---
    121
    ---
    221
    ---
    

    但是 shortest 方法(没有变量)将使用 GNU sed

    sed 'y/AB/12/; s/$/\n---/' list.txt
    

    【讨论】:

      【解决方案3】:

      这取决于你的 var 的固定程度。
      (并且始终使用 | sed 's/$/\n----/ 进行后处理)
      A=1 和 B=2(总是)

      tr 'AB' '12' < list.txt
      

      只有 var 的 A 和 B,都是 1 个字符的长值。

      tr 'AB' $(echo "$A$B") < list.txt
      

      只有var的A和B,值可以更长

      sed "s/A/$A/g; s/B/$B/g" list.txt
      

      输入文件中的每个字母都存在变量 - 请参阅@CharlesDuffy

      或者也许你有一小部分 var

      A=1;B=2;C=3;D=4;E=5;F=6; export A B D C E F
      export I="(this is letter i)"
      echo "CRAZY SED SOLUTION" | sed -r 's/[A-FI]/${&}/g' | envsubst
      # Result
      3R1ZY S54 SOLUT(this is letter i)ON
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-31
        • 2016-07-15
        • 2012-10-07
        • 2015-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多