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