2017-02-27 20 views
0

美好的一天。奇怪的字符做改变后使用perl命令

让说我的文件内容如下::

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' 为 “荃银,工艺,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 

需要帮助解决该问题。

+1

如果以下任何答案对您的目标有所帮助,请通过在答案旁边勾选正确的符号来接受/提出封闭答案。 –

回答

2

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

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

+0

谢谢@choroba,它有助于=) – MrAZ

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 2块,第一个是从开始到-queues和第二点是从该点才结束。

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

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

感谢这个sed命令,它给了我一个想法......但是之后的字符串是-log xxx0202。'$ DotDate'.log -AgentName xxx0202在运行此命令后消失。 – MrAZ

+0

@Azizul,在我只提供了部分输入的命令中,您需要根据需要更新'\ 1'后面的文本。 –

+0

谢谢,它有帮助=) – MrAZ