Perl命令的行为不符合预期?
我有一个包含以下内容的文件:Perl命令的行为不符合预期?,perl,unix,sed,Perl,Unix,Sed,我有一个包含以下内容的文件: [TEMP.s_m_update_BUS_spec] $$SRC_STAT_RA=WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat $InputFile_RA_SPE=/edwload/rqt/workingdir/status_spe/WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat [TEMP.s_m_upd_salions_rqthk] $$SRC_STAT_RN=WHG_S
[TEMP.s_m_update_BUS_spec]
$$SRC_STAT_RA=WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat
$InputFile_RA_SPE=/edwload/rqt/workingdir/status_spe/WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat
[TEMP.s_m_upd_salions_rqthk]
$$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901094550
$InputFile_RN_RQT=/edwload/rqt/workingdir/restriction/WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat
我正在使用下面的perl命令将WHG_STATUS_SITEENTSEQCHAIN_20110901094550
替换为WHG_STATUS_SITEENTSEQCHAIN_2011090199999.dat
部分中的[TEMP.s_upd_salions_rqthk]
,但不知怎的,它并没有给我预期的结果。甚至在[TEMP.s\u m\u update\u BUS\u spec]
部分下的WHG\u STATUS\u SITEENTSEQCHAIN\u 20110901094550
也被替换
perl -p -i -e "s|\$\$SRC_STAT_RN=.*|\$\$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat|g;s|\$InputFile_RN_RQT=\/edwload\/rqt\/workingdir\/restriction\/.*|\$InputFile_RN_RQT=\/edwload\/rqt\/workingdir\/restriction\/WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat|g" Input_File
请让我知道上述命令中需要的修改。相同的替代命令与SED命令配合使用效果良好。但是我想使用perl。到底是什么没有按您的要求工作?在我的机器上,运行perl代码后,文件如下所示:
[TEMP.s_m_update_BUS_spec] $$SRC_STAT_RA=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat
[TEMP.s_m_upd_salions_rqthk] $$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat
这不是你所期望的吗
编辑
尝试将命令修改为:
perl -p -i -e "s|\$\$SRC_STAT_RN=.*?|\$\$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat|gmx;s|\$InputFile_RN_RQT=/edwload/rqt/workingdir/restriction/.*?|\$InputFile_RN_RQT=/edwload/rqt/workingdir/restriction/WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat|gmx" Input_File
看看结果是否如预期的那样:
[TEMP.s_m_update_BUS_spec]
$$SRC_STAT_RA=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.datWHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat
$InputFile_RA_SPE=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat/edwload/rqt/workingdir/status_spe/WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat
[TEMP.s_m_upd_salions_rqthk]
$$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.datWHG_STATUS_SITEENTSEQCHAIN_20110901094550
$InputFile_RN_RQT=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat/edwload/rqt/workingdir/restriction/WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat
您运行的程序是
s|$$SRC_STAT_RN=.*|$$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat|g; s|$InputFile_RN_RQT=\/edwload\/rqt\/workingdir\/restriction\/.*|$InputFile_RN_RQT=\/edwload\/rqt\/workingdir\/restriction\/WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat|g
有相当多的$
应该转义,但没有转义。如果使用单引号而不是双引号,则会更简单。您可能正在尝试:
perl -i -pe'
s{\$\$SRC_STAT_RN=.*}{\$\$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat}g;
s{\$InputFile_RN_RQT=/edwload/rqt/workingdir/restriction/.*}{\$InputFile_RN_RQT=/edwload/rqt/workingdir/restriction/WHG_STATUS_SITEENTSEQCHAIN_20110901999999.dat}g;
' Input_File
我通过转义特殊字符来尝试这样做:perl-p-I-e“s| \$$SRC \$SRC \$u STAT \$RN=..\124; \$SRC \$u STATUS \$WHG \$u SITEENTSEQCHAIN \$201109019999.dat|g;s \$InputFile \/RQT \/RQT\/workingdir\/restriction\/.*124\$InputFile \/RN \/RQT \/RQT \/RQT\/workingdir\/restriction\$InputFile \/RQT \/InputFile \/RQT \/2019999.WHG输入_文件。。。。。但是,即使这样,它也没有像预期的那样工作……下面的代码工作得很好。感谢tat perl-i-pe的{\$\$SRC\u STAT\u RN=.}{\$\$SRC\u STAT\u RN=WHG\u STATUS\u SITEENTSEQCHAIN\u 2011090199999.dat}g;s{\$InputFile\u RN\u RQT=/edwload/RQT/workingdir/restriction/*}{\$InputFile\u RN\u RQT=/edwload/RQT/workingdir/restriction/WHG_STATUS\u SITEENTSEQCHAIN\u 2011090199999.dat}g;'RQT\u PROCESS.prm perl-p-i-e的|\$\$SRC\u STAT\u RN=.*.|\$\$SRC\u STAT\u RN=WHG\u STATUS\u SITEENTSEQCHAIN\u 2011090199999.dat\g;s |\$InputFile\u RN\u RQT=/edwload/RQT/workingdir/restriction/*\$InputFile\u RN\u RQT=/edwload/RQT/workingdir/restriction/WHG\u STATUS\u SiteSeqChain\u 2011090199999.dat\g;'RQT_PROCESS.prmBut能否请您解释一下,为什么下面的脚本即使在转义特殊字符perl-p-i-e之后也不能按预期工作“s | \$\$SRC_STAT_RN=...| \$$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_201109019999.dat|g;s |\$InputFile\u RN\u RQT=/edwload/RQT/workingdir/restriction/*\$InputFile\u RN\u RQT=/edwload/RQT/workingdir/restriction/WHG\u STATUS\u SiteSeqChain\u 2011090199999.dat\g;“输入文件解释是如何发生的?……您好,我使用了命令…………$perl-I-pe的{\$\$SRC\u STAT\u FN=.*}{\$\$SRC\u STAT\u FN=$OLDEST\u File\u HT\u RQT}g;s{\$InputFile\u STAT\u RQT=/edwload/RQT/workingdir/restriction/*}{$InputFile/RQT\u RQT/RQT\u最早的文件}g、 “……但是$OLDEST_FILE_HT_RQT没有被计算为它的值……我在perl之前给最早的_FILE_HT_RQT赋值。@Chethan Siddagiri,没有,你没有逃逸它们。与perl无关。就像我说的,你运行的程序是
s$$SR…
。将perl-I-pe
更改为echo
,看看shell通过了什么。”es到perl
。我尝试了上面发布的命令,但没有给出预期结果。我的预期结果如下………[临时s\U m\U更新\U总线\U规范]$$SRC_STAT_RA=WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat$InputFile_RA_SPE=/edwload/rqt/workingdir/STATUS_SPE/WHG_STATUS_SITEENTSEQCHAIN_20110901094550.dat[TEMP.s_upd_salions_rqthk]$$SRC_STAT_RN=WHG_STATUS_SITEENTSEQCHAIN_2011090199999.dat$InputFile_RN_RQT=/edwload/RQT/workingdir/restriction/WHG_STATUS_SITEENTSEQCHAIN_2011090199999.dat谢谢你的回复!!…我很感激..顺便说一句,请帮我解决上面解释的问题。。