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谢谢你的回复!!…我很感激..顺便说一句,请帮我解决上面解释的问题。。