Проблема заключается в том, что регулярное выражение используется в качестве адреса завершается первый /
, которые могли бы быть в ${rundir}
или может быть /
сразу же после этого; это, конечно, не /
после posttest
.
В общем, интерполяция переменных в регулярное выражение несколько опасна. Если содержимое переменной содержит метасимволы регулярных выражений, то, скорее всего, это может произойти непредвиденным образом. Если, как и в данном случае, значение переменной может включать терминатор регулярного выражения, то часть значения переменной будет интерпретирована как команда.
С учетом этого предупреждения у вас есть несколько вариантов. Если вы знаете, что какой-то символ, скажем :
, не отображается в ${rundir}
, то вы можете использовать этот символ в качестве терминатора регулярных выражений. (Обратите внимание на обратную косую черту, которая, как вы говорите СЕПГ, что далее следует регулярное выражение.)
sed -e "\:^#PBS -o ${rundir}/posttest:s#_CMODEL#${cmodel}#" \
-e "\:^#PBS -e ${rundir}/posttest:s#_CMODEL#${cmodel}#" \
"${rundir}/run_post.shell" >"${rundir}/run_post.${cmodel}.sh"
В качестве альтернативы, вы можете обратной косой черты избежать буквального /
и использовать синтаксис шаблонов подстановки Баш на обратной косой черты избежать всех /
в $rundir
:
${rundir//\//\\/}
(Как уже упоминалось выше, вы действительно должны бежать все возможные метасимволов, включая обратную косую черту себя.)
У '$ {rundir}' есть '/' символы в нем? – Barmar
Если вы ожидаете, что '/^# PBS -o $ {rundir}/posttest /' будет шаблоном регулярного выражения, который указывает, к каким строкам применяется команда 's', тогда вам нужно избежать внутреннего'/'. В противном случае будет полезно объяснение того, что вы пытаетесь сделать. – rici
@Barmar yes $ {rundir} имеет/в нем что-то меняет что-то – user3431573