My.txt文件如下(请考虑它是1GB文件(:
hello,12,abcd,xyz
welcome,13,abcd,yul
hai,14,abcd,ghk
现在,我想加密第一列和第三列,如下所示
zzyyy,12,zzzz,xyz
asdsddd,13,zzzz,yul
asd,14,zzzz,ghk
我有加密密钥,如下面的
export key=ETAOINSHRDLUBCFGJMQPVWZYXK
现在,我需要在perl脚本中应用这个密钥来加密文件中的第一列和第三列:
export key=ETAOINSHRDLUBCFGJMQPVWZYXK
perl -F, -lane '$F[$_] =~ tr/a-z/A-Z/ =~ tr/A-Z/"$key"/ for (0, 2); print join(",", @F)' file.txt
所以,当在上面的脚本中运行时,键没有被应用,第二个tr命令也不起作用。所以,你能帮我找出剧本中的错误吗。
我只需要像下面这样在上面的Perl脚本中应用
tr "a-z" "A-Z" | tr "A-Z" "$key"
我在tr///
:的文档中看到了这一点
从来没有任何变量插值,所以"以及"@"总是被视为文字。
因此,试图通过环境传递密钥是行不通的。但是您可以这样做,将shell变量插入到perl代码中:
perl -F, -lane '
sub encode { my $str = uc shift; $str =~ tr/A-Z/'"$key"'/r; }
# ..............................................^^....^^
$F[$_] = encode($F[$_]) for (0, 2);
print join(",", @F)
' file.txt
输出:
HIUUF,12,ETAO,xyz
ZIUAFBI,13,ETAO,yul
HER,14,ETAO,ghk
或者,使用eval
perl -F, -lane '
sub encode { my $str = uc shift; eval "$str =~ tr/A-Z/$ENV{key}/r" }
$F[$_] = encode($F[$_]) for (0, 2);
print join(",", @F)
' file.txt