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

Bash 如何查找文件中每行中的每个字符作为变量名?,bash,loops,variables,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 我怎样才能把它作为我的输出呢 112 ---- 121 ---- 221 ---- 备选bash+awk解决方案: #!/bin/bash A=1 B=2 awk -v A="

在bash脚本中,我设置了一些如下的变量

A=1
B=2
我有一个名为list.txt的文本文件,其中包含

AAB
ABA
BBA
我的剧本里也有

while read LINE
do
    echo "$LINE" | grep -o .
    echo "----"
done < list.txt
我怎样才能把它作为我的输出呢

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

备选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

但是最短的方法(没有变量)是GNUsed

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

备选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

但是最短的方法(没有变量)是GNUsed

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

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

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

或者你可能有一个小的变量集

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

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

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

或者你可能有一个小的变量集

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

顺便说一句,这并不是一个真正理想的问题——如果你把它的范围缩小到一次只问一件事,那么我们的知识中已经有了一个“一件事”可能是什么的复制品。例如,如何逐字符迭代一行字符,我们已经得到了;如何在变量名中查找该变量的值,我们已经得到了;如何逐行读取文件或流,我们已经有了。。。等等。您可以做一些类似于
tr'AB'$(echo“$A$B”)
,跳过中间行(您可以使用
|sed's/$/\n-->/
添加中间行)的操作吗?您如何知道替换需要使用哪些变量?@WalterA,…当然,上面假设替换值每个只能是一个字符。顺便说一句,这不是一个真正理想的问题--如果您将其范围缩小为一次只问一件事,对于“一件事”可能是的任何东西,我们都会有一个复制品。例如,如何逐字符迭代一行字符,我们已经得到了;如何在变量名中查找该变量的值,我们已经得到了;如何逐行读取文件或流,我们已经有了。。。等等。您可以做一些类似于
tr'AB'$(echo“$A$B”)
,跳过中间行(您可以使用
|sed's/$/\n-->/
添加中间行)的操作吗?您如何知道替换需要使用哪些变量?@WalterA,…当然,上面假设替换值每个只能是一个字符。
tr 'AB' '12' < list.txt
tr 'AB' $(echo "$A$B") < list.txt
sed "s/A/$A/g; s/B/$B/g" list.txt
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