Я пытаюсь использовать файл сценария оболочки в оболочке Bash. В этом сценарии, 2 sed
команды там. Второе sed
команда следует.
sed -e s:MACRO_NAME:"${runmacro}":g \
-e s:INFILE_PATH_NAME:"${filedir}"/"${filename}":g \
-e s:INFILE_NAME:"${filename%.*}":g \
-e s:INDEX:"${index}":g \
-e s:TREE_NAME:"${treename}":g \
-e s:SUFFIX:"${suffix}":g \
-e s:SMEAR_TEMPLATE_NAME:"${smeartemplatename}":g \
-e s:IS_MC:"${ismc}":g \
-e s:PWD:.:g \
-e s:SCRAM_DIR:"${scramdir}":g \
-e s:OUTFILE_NAME:"${outfilename}":g \
-e s:OUTFILE_DIR:"${outputpath}":g \
-e s:PREFIX:"${prefix}":g \
-e s:OUTPUT_DIR:"${outputdir}":g \
template_files/submit_script_template.sh > tempfile \
&& mv tempfile ../"${outputdir}"/submit_"${outputdir}"_"${index}".sh
Путем выполнения .sh
файл, я получаю эту ошибку:
sed: -e expression #2, char 25: unknown option to `s'
Я добавил echo
кому: sed
также. Результат:
sed -e s:MACRO_NAME:QCDSmearedSkimmer.C:g \
-e s:INFILE_PATH_NAME:root://cmseos.fnal.gov//store/user/lpcstop/noreplica/13TeV/290117/Moriond17/qcd_orig//qcd_ht1000to1500-ext_10_ntuple_postproc.root:g \
-e s:INFILE_NAME:qcd_ht1000to1500-ext_10_ntuple_postproc:g \
-e s:INDEX:2:g \
-e s:TREE_NAME:Events:g \
-e s:SUFFIX:SmearedQCD:g \
-e s:SMEAR_TEMPLATE_NAME:resTailOut_combined_filtered_CHEF_puWeight_weight_WoH.root:g \
-e s:IS_MC:1:g \
-e s:PWD:.:g \
-e s:SCRAM_DIR:${CMSSW_BASE}:g \
-e s:OUTFILE_NAME:qcd_ht1000to1500-ext_10_ntuple_postproc_1_SmearedQCD.root:g \
-e s:OUTFILE_DIR:/ddash/nobackup/mywork/qcd/CMSSW_9_4_6_patch1/src/AnalysisMethods/macros/Skims/generate_smear_scripts/smeared_file/:g \
-e s:PREFIX:root://cmseos.fnal.gov//:g \
-e s:OUTPUT_DIR:qcd_smeared_file3:g \
template_files/submit_script_template.sh > tempfile \
&& mv tempfile ../qcd_smeared_file3/submit_qcd_smeared_file3_2.sh
Помогите мне решить эту проблему.
В sed выражении s:INFILE_PATH_NAME:"${filedir}"/"${filename}":g
, существует пять частей:
sed
команда s
,INFILE_PATH_NAME
),"${filedir}"/"${filename}"
- в этом примере это root://cmseos.fnal.gov//store/user/lpcstop/noreplica/13TeV/290117/Moriond17/qcd_orig//qcd_ht1000to1500-ext_10_ntuple_postproc.root
),s
команда (здесь g
),:
(двоеточие) здесь.Теперь, если текст замены содержит :
, затем sed будет думать, что текст замены заканчивается там, и независимо от того, что следует, опции к s
. Таким образом вместо
root://cmseos.fnal.gov//store/user/lpcstop/noreplica/13TeV/290117/Moriond17/qcd_orig//qcd_ht1000to1500-ext_10_ntuple_postproc.root
g
,мы добираемся:
root
//cmseos.fnal.gov//store/user/lpcstop/noreplica/13TeV/290117/Moriond17/qcd_orig//qcd_ht1000to1500-ext_10_ntuple_postproc.root:g
который недопустим насколько sed затронут.
Предложенные решения:
используйте другой разделитель, некоторый символ, который не появится в тексте замены, такой как ,
(запятая), ;
(точка с запятой), и т.д. Например:
sed -e "s,INFILE_PATH_NAME,${filedir}/${filename},g" ...
:
с обратной косой чертой так, чтобы это стало \:
.Ошибка появляется, потому что Ваши переменные (по крайней мере некоторые из них) содержат двоеточия (:
) и Вы используете двоеточие в качестве разделителя для s/…/…/
команда. На самом деле для s:…:…:
управляйте в своем случае.
Когда Вы имеете
var="ex:ample"
и затем попытайтесь выйти
sed -e "s:${var}:sample:g" some_file
затем оболочка интерполирует переменную перед передачей его к sed
, и sed
как называют так:
sed -e "s:ex:ample:sample:g" some_file
и s:…:…:
теперь повреждается. Похоже, что Вы говорите sed
заменять ex
с ample
и примените опции s
, a
, m
, p
, l
, и e
.
Для предотвращения этого используйте другой разделитель, который Вы уверены в нем, не появляется в Вашем тексте. Популярные разделители +
и #
но можно выбрать любой символ. Разделитель является на самом деле первым символом после s
, так
sed -e "s#…#…#" some_file
sed -e "s+…+…+" some_file
sed -e "s'…'…'" some_file
все сделает.