Проблема в том, что регулярное выражение, которое вы используете в качестве адреса, заканчивается первым /
, который может быть в ${rundir}
или может быть /
сразу после него; это точно не /
после posttest
.
В общем, интерполяция переменных в регулярное выражение несколько опасна. Если содержимое переменной включает метасимволы регулярных выражений, то, скорее всего, произойдет неожиданный сбой. Если, как в данном случае, значение переменной может включать терминатор регулярного выражения, то часть значения переменной будет интерпретироваться как команда.
Учитывая это предупреждение, у вас есть несколько вариантов. Если вы знаете, что какой-то символ, скажем, :
, не появляется в ${rundir}
, вы можете использовать этот символ в качестве терминатора регулярного выражения. (Обратите внимание на обратную косую черту, с помощью которой вы сообщаете sed, что последующее является регулярным выражением.)
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"
В качестве альтернативы вы можете экранировать букву /
с обратной косой чертой и использовать синтаксис замены шаблона bash для экранирования с обратной косой черты всех /
в $rundir
:
${rundir//\//\\/}
(Как упоминалось выше, вам действительно следует избегать всех возможных метасимволов, включая обратную косую черту.)
person
rici
schedule
21.05.2015
${rundir}
/
символа? - person Barmar   schedule 21.05.2015/^#PBS -o ${rundir}/posttest/
будет шаблоном регулярного выражения, указывающим, к каким строкам будет применяться командаs
, вам нужно избежать внутреннего/
. В противном случае было бы полезно некоторое объяснение того, что вы пытаетесь сделать. - person rici   schedule 21.05.2015posttest
, так и те, которые находятся в переменной. - person Barmar   schedule 21.05.2015bash
, вы можете попробоватьsed -e "/^#PBS -\(o\|e\) ${rundir//\//\\\/}\/postest/s#_CMODEL#${cmodel}#" ${rundir}/run_post.shell >${rundir}/run_post.${cmodel}.sh
. - person alvits   schedule 21.05.2015-e
в моем предыдущем комментарии. - person alvits   schedule 21.05.2015:
или!
или даже,
. например:s/foo/bar/
совпадает сs!foo!bar!
илиs,foo,bar,
- person Sammitch   schedule 21.05.2015-[eo]
намного приятнее для глаз, чем-\(o\|e\)
, а\|
— это расширение Gnu sed, которое может быть доступно не во всех sed. - person rici   schedule 21.05.2015s
. Попробуйте это дляaddress
локации и посмотрите, что получится. Сравнитеsed -n '/root/p' /etc/passwd
сsed -n '!root!p' /etc/passwd
илиsed -n '|root|p' /etc/passwd
и поделитесь с нами своим опытом. - person alvits   schedule 21.05.2015