【问题标题】:Why am I getting this unknown option error为什么我会收到此未知选项错误
【发布时间】:2015-08-02 11:06:11
【问题描述】:

我是 UNIX 脚本的新手,我正在尝试使用 sed 命令替换文本,但我不断收到此错误:

sed: -e expression #1, char 51: `s' 的未知选项

这是我拥有的代码的 sn-p:

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} 中有 / 字符吗?
  • 如果您希望/^#PBS -o ${rundir}/posttest/ 是一个正则表达式模式,指示s 命令将应用于哪些行,那么您需要转义内部/。否则,对您正在尝试做的事情进行一些解释会有所帮助。
  • @Barmar 是的 ${rundir} 确实有 / 它确实改变了任何东西
  • 您需要转义正则表达式中的所有斜杠,posttest 之前的显式斜杠和变量中的斜杠。
  • @alvits:很好。但是-[eo] 比-\(o\|e\) 在视觉上要容易得多,而\| 是一个 Gnu sed 扩展,可能并非在所有 sed 中都可用。

标签: bash sed


【解决方案1】:

您需要转义用作地址的正则表达式中的斜杠。否则,第一个斜杠将结束正则表达式,下一个字符将被视为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

【讨论】:

    【解决方案2】:

    问题是您用作地址的正则表达式被第一个/ 终止,它可能在${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//\//\\/}
    

    (如上所述,您确实应该转义所有可能的元字符,包括反斜杠本身。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2018-06-22
      • 2016-01-01
      • 1970-01-01
      相关资源
      最近更新 更多