我有这个字符串:“abcdef”,我想用另一个字符串替换每个字符。我用sed做了但是发生了冲突,如果在被替换的字符串上有另一个字符,例如a,它再次用字符串替换a。
例如:string abcdef用arv替换a它将再次替换一个字符。 有什么建议吗?
安装了busybox的环境sh4 非常感谢
string='yhWEmUZltnEfmN8cZKayQkX8S8ejzgdUTiBhilDgLY2dLj0YgWgRJW3K7V3YVYwm6G9h79azWXiz3dK6pvfyuW1Jf5L093IcbrzFOkAf0jrhdunDrs7C7jR6eDlpfwLp9zUM8vxiK9kEzIfpjyKFcwO1VVTAKEZVm1x9YSxQkyq6DVcxCjjdtzJKW1WefxTf5s3THBpLMlpWzv23MrL9DZxRQvQgCOEWHgq0hI936vgansKWPW4sFNdlBlDFRsj1bsGvDD9VrROMjosrZzAYFe8Z5JAzsUVju7BiqbA9XslWjMRgdvAdTt87d3308dyujf98e'
decoded=$(echo -n "$string" | sed 's/yhWEm/a/g;s/UZltn/b/g;s/EfmN8/c/g;s/cZKay/d/g;s/QkX8S/e/g;s/8ejzg/f/g;s/dUTiB/g/g;s/hilDg/h/g;s/LY2dL/i/g;s/j0YgW/j/g;s/gRJW3/k/g;s/K7V3Y/l/g;s/VYwm6/m/g;s/G9h79/n/g;s/azWXi/o/g;s/z3dK6/p/g;s/pvfyu/q/g;s/W1Jf5/r/g;s/L093I/s/g;s/cbrzF/t/g;s/OkAf0/u/g;s/jrhdu/v/g;s/nDrs7/w/g;s/C7jR6/x/g;s/eDlpf/y/g;s/wLp9z/z/g;s/UM8vx/A/g;s/iK9kE/B/g;s/zIfpj/C/g;s/yKFcw/D/g;s/O1VVT/E/g;s/AKEZV/F/g;s/m1x9Y/G/g;s/SxQky/H/g;s/q6DVc/I/g;s/xCjjd/J/g;s/tzJKW/K/g;s/1Wefx/L/g;s/Tf5s3/M/g;s/THBpL/N/g;s/MlpWz/O/g;s/v23Mr/P/g;s/L9DZx/Q/g;s/RQvQg/R/g;s/COEWH/S/g;s/gq0hI/T/g;s/936vg/U/g;s/ansKW/V/g;s/PW4sF/W/g;s/NdlBl/X/g;s/DFRsj/Y/g;s/1bsGv/Z/g;s/DD9Vr/0/g;s/ROMjo/1/g;s/srZzA/2/g;s/YFe8Z/3/g;s/5JAzs/4/g;s/UVju7/5/g;s/BiqbA/6/g;s/9XslW/7/g;s/jMRgd/8/g;s/vAdTt/9/g;s/87d33/=/g;s/08dyu/_/g;s/jf98e/-/g;')
echo "Decrypt: $decoded"
ecnoded=$(echo -n "$decoded" | sed 's/a/yhWEm/g;s/b/UZltn/g;s/c/EfmN8/g;s/d/cZKay/g;s/e/QkX8S/g;s/f/8ejzg/g;s/g/dUTiB/g;s/h/hilDg/g;s/i/LY2dL/g;s/j/j0YgW/g;s/k/gRJW3/g;s/l/K7V3Y/g;s/m/VYwm6/g;s/n/G9h79/g;s/o/azWXi/g;s/p/z3dK6/g;s/q/pvfyu/g;s/r/W1Jf5/g;s/s/L093I/g;s/t/cbrzF/g;s/u/OkAf0/g;s/v/jrhdu/g;s/w/nDrs7/g;s/x/C7jR6/g;s/y/eDlpf/g;s/z/wLp9z/g;s/A/UM8vx/g;s/B/iK9kE/g;s/C/zIfpj/g;s/D/yKFcw/g;s/E/O1VVT/g;s/F/AKEZV/g;s/G/m1x9Y/g;s/H/SxQky/g;s/I/q6DVc/g;s/J/xCjjd/g;s/K/tzJKW/g;s/L/1Wefx/g;s/M/Tf5s3/g;s/N/THBpL/g;s/O/MlpWz/g;s/P/v23Mr/g;s/Q/L9DZx/g;s/R/RQvQg/g;s/S/COEWH/g;s/T/gq0hI/g;s/U/936vg/g;s/V/ansKW/g;s/W/PW4sF/g;s/X/NdlBl/g;s/Y/DFRsj/g;s/Z/1bsGv/g;s/0/DD9Vr/g;s/1/ROMjo/g;s/2/srZzA/g;s/3/YFe8Z/g;s/4/5JAzs/g;s/5/UVju7/g;s/6/BiqbA/g;s/7/9XslW/g;s/8/jMRgd/g;s/9/vAdTt/g;s/=/87d33/g;s/_/08dyu/g;s/-/jf98e/g;')
echo "Encrypt: $ecnoded"
second_decode=$(echo -n "$ecnoded" | sed 's/yhWEm/a/g;s/UZltn/b/g;s/EfmN8/c/g;s/cZKay/d/g;s/QkX8S/e/g;s/8ejzg/f/g;s/dUTiB/g/g;s/hilDg/h/g;s/LY2dL/i/g;s/j0YgW/j/g;s/gRJW3/k/g;s/K7V3Y/l/g;s/VYwm6/m/g;s/G9h79/n/g;s/azWXi/o/g;s/z3dK6/p/g;s/pvfyu/q/g;s/W1Jf5/r/g;s/L093I/s/g;s/cbrzF/t/g;s/OkAf0/u/g;s/jrhdu/v/g;s/nDrs7/w/g;s/C7jR6/x/g;s/eDlpf/y/g;s/wLp9z/z/g;s/UM8vx/A/g;s/iK9kE/B/g;s/zIfpj/C/g;s/yKFcw/D/g;s/O1VVT/E/g;s/AKEZV/F/g;s/m1x9Y/G/g;s/SxQky/H/g;s/q6DVc/I/g;s/xCjjd/J/g;s/tzJKW/K/g;s/1Wefx/L/g;s/Tf5s3/M/g;s/THBpL/N/g;s/MlpWz/O/g;s/v23Mr/P/g;s/L9DZx/Q/g;s/RQvQg/R/g;s/COEWH/S/g;s/gq0hI/T/g;s/936vg/U/g;s/ansKW/V/g;s/PW4sF/W/g;s/NdlBl/X/g;s/DFRsj/Y/g;s/1bsGv/Z/g;s/DD9Vr/0/g;s/ROMjo/1/g;s/srZzA/2/g;s/YFe8Z/3/g;s/5JAzs/4/g;s/UVju7/5/g;s/BiqbA/6/g;s/9XslW/7/g;s/jMRgd/8/g;s/vAdTt/9/g;s/87d33/=/g;s/08dyu/_/g;s/jf98e/-/g;')
echo "Second Decrypt: $second_decode"
答案 0 :(得分:1)
太糟糕了,你在busybox上没有tclsh,它有一个内置的string map
命令是理想的。这是awk和shell中的实现:
#!/bin/sh
code () {
codemap="a yhWEm b UZltn c EfmN8 d cZKay e QkX8S f 8ejzg g dUTiB h hilDg i LY2dL j j0YgW k gRJW3 l K7V3Y m VYwm6 n G9h79 o azWXi p z3dK6 q pvfyu r W1Jf5 s L093I t cbrzF u OkAf0 v jrhdu w nDrs7 x C7jR6 y eDlpf z wLp9z A UM8vx B iK9kE C zIfpj D yKFcw E O1VVT F AKEZV G m1x9Y H SxQky I q6DVc J xCjjd K tzJKW L 1Wefx M Tf5s3 N THBpL O MlpWz P v23Mr Q L9DZx R RQvQg S COEWH T gq0hI U 936vg V ansKW W PW4sF X NdlBl Y DFRsj Z 1bsGv 0 DD9Vr 1 ROMjo 2 srZzA 3 YFe8Z 4 5JAzs 5 UVju7 6 BiqbA 7 9XslW 8 jMRgd 9 vAdTt = 87d33 _ 08dyu - jf98e"
echo "$1" | awk -v codemap="$codemap" -v method="$2" '
BEGIN {
n = split(codemap, a)
for (i=1; i<n; i+=2) {
_encoding[a[i]] = a[i+1]
_decoding[a[i+1]] = a[i]
}
}
function decode(str) {
decoded = ""
while (str) {
for (code in _decoding) {
if (substr(str, 0, length(code)) == code) {
str = substr(str, length(code)+1)
decoded = decoded _decoding[code]
break
}
}
}
return(decoded)
}
function encode(str) {
encoded = ""
while (str) {
for (code in _encoding) {
if (substr(str, 0, length(code)) == code) {
str = substr(str, length(code)+1)
encoded = encoded _encoding[code]
break
}
}
}
return(encoded)
}
{
if (method == "encode")
print encode($0)
else if (method == "decode")
print decode($0)
}
'
}
encode () { code "$1" encode; }
decode () { code "$1" decode; }
string="yhWEmUZltnEfmN8cZKayQkX8S8ejzgdUTiBhilDgLY2dLj0YgWgRJW3K7V3YVYwm6G9h79azWXiz3dK6pvfyuW1Jf5L093IcbrzFOkAf0jrhdunDrs7C7jR6eDlpfwLp9zUM8vxiK9kEzIfpjyKFcwO1VVTAKEZVm1x9YSxQkyq6DVcxCjjdtzJKW1WefxTf5s3THBpLMlpWzv23MrL9DZxRQvQgCOEWHgq0hI936vgansKWPW4sFNdlBlDFRsj1bsGvDD9VrROMjosrZzAYFe8Z5JAzsUVju7BiqbA9XslWjMRgdvAdTt87d3308dyujf98e"
decoded=$(decode "$string")
echo "$decoded"
recoded=$(encode "$decoded")
[[ $string == "$recoded" ]] && echo success || echo fail
答案 1 :(得分:0)
你可以通过迭代(和替换)输入字符串的每个字符来编写一个简单的bash脚本来完成这项工作(例如replace.sh):
foo=$(</dev/stdin)
for (( i=0; i<${#foo};i++ )); do
c=${foo:$i:1};
case "$c" in
"a") c="bcd" ;;
"b") c="cde" ;;
esac;
echo -n $c;
done
只需调用它:
$ echo "abcd" | ./replace.sh
bcdcdecd