使用perl命令进行更改后的奇怪字符

时间:2017-02-27 06:43:00

标签: regex perl awk sed

美好的一天。

我的文件内容如下::

java ${AGENT_JAVAOPTS} -Xmx2560m com.xxx.xxx.xxx.AgentXX   -inifile ${XXX_AGENT_INI}  -queues winall,dustat,envstat,netstat,iostat,winconfig,netwarestat,netwareconfig,pawmin,paw15,db2,sqlserver,vmstatvmw2,vmstatvm2,netstatvm,netstatvmw,vmstatvm,vmstatvmw,iostatvm,iostatvmw,envstatvm,envstatvmw,vmscpu,vmsdisk,vmsmem,vmstatvcw,process,winprocess  -log xxx0202.'$DotDate'.log -AgentName xxx0202

然后,我尝试将'-queue'之后的字符串更改为“winall,process,winconfig,vmscpu,vmstat,dustat”,我在UNIX中使用了以下命令::

perl -pi -e 'tr/winall,dustat,envstat,netstat,iostat,winconfig,netwarestat,netwareconfig,pawmin,paw15,db2,sqlserver,vmstatvmw2,vmstatvm2,netstatvm,netstatvmw,vmstatvm,vmstatvmw,iostatvm,iostatvmw,envstatvm,envstatvmw,vmscpu,vmsdisk,vmsmem,vmstatvcw,process,winprocess/winall,process,winconfig,vmscpu,vmstat,dustat/' file

然而,它产生了一个带有奇怪字符的输出,如下所示::

jaia ${AGENT_JAVAOPTS} -Xtxtt60t u,t.itt.ott.cotau,.At,ncDP   -iniail, ${SRM_AGENT_INI}  -tr,r,o winall,procac,,niocac,n,cocac,i,ocac,winu,nait,n,cwat,ocac,n,cwat,u,nait,tawtin,tawtt,ptt,otlo,ti,t,itocacitwt,itocacitt,n,cocacit,n,cocacitw,itocacit,itocacitw,i,ocacit,i,ocacitw,,niocacit,,niocacitw,itoutr,itopiot,itot,t,itocaciuw,tt,u,oo,wintt,u,oo  -l,t tlp0t0t.'$D,cDac,'.l,t -At,ncNat, tlp0t0t

为什么会产生如上所述的输出?

输出假设为:

java ${AGENT_JAVAOPTS} -Xmx2560m com.xxx.xxx.xxx.AgentXX   -inifile ${XXX_AGENT_INI} -queues winall,process,winconfig,vmscpu,vmstat,dustat -log xxx0202.'$DotDate'.log -AgentName xxx0202

需要协助解决此问题。

2 个答案:

答案 0 :(得分:2)

tr///是音译,而不是替换。

它将SEARCHLIST的第一个字符替换为REPLACEMENTLIST的第一个字符(类似于y///中的sed),依此类推。您需要的是替换s///。有关详细信息,请参阅perlop

答案 1 :(得分:1)

sed -r 's/(^.*-queues)(.*)/\1 winall,process,winconfig,vmscpu,vmstat,dustat/' inputfile
java ${AGENT_JAVAOPTS} -Xmx2560m com.xxx.xxx.xxx.AgentXX -inifile ${XXX_AGENT_INI} -queues winall,process,winconfig,vmscpu,vmstat,dustat

这里,使用backrefrencing将行分为两个块,1st从开始到-queues,第二个从该点到结束。

或者您可以使用awk将文本存储到变量中,并在替换时使用它。您可以在此处通过更改变量var的值来更改文本。

awk -v FS='-queues' -v var='winall,process,winconfig,vmscpu,vmstat,dustat' '{print $1 FS var}' inputfile