【问题标题】:sed error "unterminated 's' command" troubleshootingsed 错误“未终止的's'命令”故障排除
【发布时间】:2011-05-03 11:57:26
【问题描述】:

我正在构建一个script,除其他外,它将用文件夹路径替换 XML 文件中的模式。

我尝试使用的sed 命令是:

SEDCMD="s|PATHTOEXPORT|$2|"

其中$2 是其中包含文件夹路径的命令行参数。

这后来被称为:

sed -e $SEDCMD $FILTER > $TEMPFILTER

但是,在运行命令时,我收到“未终止的 's' 命令”错误。

我该如何解决这个问题?我尝试更改用于分隔正则表达式的字符(从/|)。而且我尝试过(以不同的方式)引用命令行参数。

【问题讨论】:

    标签: regex debugging shell sed


    【解决方案1】:

    shell 正在解析$SEDCMD 的内容。如果你从一个 shell 脚本中使用它,包括一个 Makefile,你应该总是用双引号保护你所有的扩展变量。双引号将强制变量插值,但保护任何 shell 元字符免于进一步解释。

    sed -e "$SEDCMD" "$FILTER" > "$TEMPFILTER"
    

    我假设$FILTER$TEMPFILTER 是文件名?我也引用了它们,以防它们包含诸如空格或其他类型的 shell 元字符之类的邪恶内容;很奇怪,是的,但众所周知。定期在文件名上运行rename 's/\s+/_/g' 以清除它们的空白,但对于其他文件,您必须采取更谨慎的方法;例如,如何处理星号、问号、括号和括号等。

    如果您将-x 和/或-v 添加到您的shell 命令行,您将获得一些跟踪调试,我认为这很可能会显示您在这里出错的地方。

    【讨论】:

    • 是的 - $FILTER 和 $TEMPFILTER 都是文件名(没有时髦的空格)
    猜你喜欢
    • 2016-03-10
    • 2012-05-05
    • 1970-01-01
    • 2016-07-29
    • 2019-05-04
    • 2015-09-25
    • 2013-06-11
    • 2012-07-10
    • 2013-11-27
    相关资源
    最近更新 更多