美好的一天。
我的文件内容如下::
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
需要协助解决此问题。
答案 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