Perl替换输出从Bash脚本输入中删除字符

时间:2014-05-23 23:50:48

标签: regex perl bash

我在bash脚本中有一个变量,长度为64个字符

authkey=$(LC_ALL=C tr -cd 'a-zA-Z0-9,;.:_#*+~!@$%&()=?{[]}|><-' < /dev/random | head -c 64)

如果我将变量解析为perl来进行字符串替换

perl -pi -e "s/'AUTH_KEY',         'put your unique phrase here'/'AUTH_KEY',         '$authkey'/" test.txt

取决于所选的随机字符,输出的长度不同。输出看起来如下(第一个字符串是生成的文本文件中的输出,第二个字符串是变量的回显输出) bash脚本)

q=dB7oUz59.IDBXI:i>ckW4oy3smX&k:-C.[rIf*9w}H=(N93yiB&nk{fP:y0_
q=dB7oUz59.IDBXI:i>ckW4oy3smX&k$s:-C.[rIf*9w}H=(N93yiB&nk{fP:y0_

5A+BwP~l3~<evp.ciTkMYtvmPjyMrL=):Qj1VaMI(,TSS,ZGMcd.m,4W
5A+BwP~l3~<evp.ciTkMYtvmPjyMrL=):Qj1VaMI(@Dk7UNgs,TSS,ZGMcd.m,4W

dX73}i5G1d;L*J=60WHHe<!61Ji_KJ)T5B~b2bCfaNDjBQr_N]}3HS=;GzAaX<gB
dX73}i5G1d;L*J=60WHHe<!61Ji_KJ)T5B~b2bCfaNDjBQr_N]}3HS=;GzAaX<gB

6Ndn(9+:>(6>*rh?B.m),3POp)>sfm8c1rh9vXr~fzZj;]!)kf3#60=M
6Ndn(9+:>(6>*rh?B.m),3POp)>sfm8c1rh9vXr~fzZj;]@YH!)kf3#$=$$ckt=M

FYMI,K|6WutC&dr-3]6)f(>QU-~{vBX>n!J-zq:kK84T|fZ7UW:{1&qU[nwYZLmC
FYMI,K|6WutC&dr-3]6)f(>QU-~{vBX>n!J-zq:kK84T|fZ7UW:{1&qU[nwYZLmC

5A+BwP~l3~<evp.ciTkMYtvmPjyMrL=):Qj1VaMI(,TSS,ZGMcd.m,4W
5A+BwP~l3~<evp.ciTkMYtvmPjyMrL=):Qj1VaMI(@Dk7UNgs,TSS,ZGMcd.m,4W

v1FR8c8}dZD(QGwOrr%M{FSUw*?h.JGI?Ay4tgRVp~l7C5eAxW<w<;c}emeX#S
v1FR8c8}dZD(QGwOrr%M{FSUw*?h.JGI?Ay4tgRVp@s~l7C5eAxW<w<;c}emeX#S

+MGg0=*NrhJ}.qPkk6v[lc)J.uiW1o?LL5t<HTC#Q-hSeqn%-ke!cwL5tk[e
+MGg$|=*NrhJ}.qPkk6v[lc)J.uiW1o?L$55L5t<HTC#Q-hSeqn%-ke!cwL5tk[e

每个字符的丢失都是由字符组开头的$@引起的。有没有办法防止这种行为?最好的问候拉尔夫

2 个答案:

答案 0 :(得分:1)

使用单引号'作为分隔符而不是斜杠/进行替换会抑制变量插值

$ foobar=\$bar; perl -p -e "s'foo'$foobar'"
xx
xx
foo
$bar
^C
$ 

不幸的是,替换中匹配的单引号现在需要转义

foobar=\$bar; perl -p -e "s'\'foo'$foobar\''"
x
x
'foo
$bar'
^C

但是这似乎已经传递给了Perl OK,没有使用sed重新设置authkey内容

答案 1 :(得分:0)

在调用perl:

之前,您可以转义$@
 authey=$(echo -n "$authkey" | sed -re 's/(\$|\@)/\\\1/g')