为什么我会收到此未知选项错误

时间:2015-05-21 00:28:08

标签: bash sed

我是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

请让我知道我做错了什么。非常感谢!!!

2 个答案:

答案 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

(如上所述,你真的应该逃避所有可能的元字符,包括反斜杠本身。)