如何查找文件中每行中的每个字符作为变量名?

时间:2017-10-31 22:50:34

标签: bash loops variables

在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
----

3 个答案:

答案 0 :(得分: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
----

答案 1 :(得分:1)

替代 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
---

最短方法(没有变量)将使用GNU sed

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

答案 2 :(得分:0)

这取决于你的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

输入文件中的每个字母都存在Var - 请参阅@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