我是UNIX脚本的新手,我正在尝试使用sed命令替换文本,但我一直收到此错误:
sed:-e表达式#1,字符51:“s”的未知选项
以下是我所拥有的代码片段:
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
请让我知道我做错了什么。非常感谢!!!
答案 0 :(得分:0)
您需要转义正在用作地址的正则表达式中的斜杠。否则,第一个斜杠将结束正则表达式,下一个字符将被视为sed
命令以对这些选定的行进行操作。您需要为$rundir
中的斜杠和${rundir}
与posttest
之间的斜杠执行此操作。
对于变量,您可以使用bash的${parameter/pattern/replacement}
语法来转义斜杠,描述为here。
sed -e "/^#PBS -o ${rundir//\//\\/}\/posttest/s#_CMODEL#${cmodel}#" \
-e "/^#PBS -e ${rundir//\//\\/}\/s#_CMODEL#${cmodel}#" \
${rundir}/run_post.shell >${rundir}/run_post.${cmodel}.sh
答案 1 :(得分:0)
问题在于,您用作地址的正则表达式会被第一个/
终止,该${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"
中,那么您可以将该字符用作正则表达式终止符。 (注意反斜杠,这就是你告诉sed后面的内容是正则表达式的方法。)
/
或者,您可以反斜杠 - 转义文字/
并使用bash的模式替换语法反斜杠 - 转义$rundir
中的所有${rundir//\//\\/}
:
System.Reflection.TargetInvocationException
(如上所述,你真的应该逃避所有可能的元字符,包括反斜杠本身。)