sed: неизвестная опция к'

Я пытаюсь использовать файл сценария оболочки в оболочке 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

Помогите мне решить эту проблему.

0
задан 13 August 2018 в 01:42

2 ответа

В 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 затронут.

Предложенные решения:

  1. используйте другой разделитель, некоторый символ, который не появится в тексте замены, такой как , (запятая), ; (точка с запятой), и т.д. Например:

    sed -e "s,INFILE_PATH_NAME,${filedir}/${filename},g" ...
    
  2. Везде, где Вы узнаете ваше мнение от, Escape : с обратной косой чертой так, чтобы это стало \:.
3
ответ дан 28 October 2019 в 04:52

Ошибка появляется, потому что Ваши переменные (по крайней мере некоторые из них) содержат двоеточия (:) и Вы используете двоеточие в качестве разделителя для 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

все сделает.

2
ответ дан 28 October 2019 в 04:52

Другие вопросы по тегам:

Похожие вопросы: