sh脚本行中“ - ”的用途是什么:ext =“$(echo $ ext | sed's /\./\\./' - )”

时间:2013-02-08 21:27:32

标签: sed gnu sh bsd

我正在移植一个sh脚本,显然是使用sed的GNU实现写入sed的BSD实现。脚本中与原始注释的确切行是:

# escape dot in file extension to grep it
ext="$(echo $ext | sed 's/\./\\./' -)"

我可以使用以下内容重现结果(显然我并没有耗尽ext的所有可能性值):

ext=.h; ext="$(echo $ext | sed 's/\./\\./' -)"; echo [$ext]

使用GNU的sed实现,返回以下内容:

[\.h]

使用BSD的sed实现,返回以下内容:

sed: -: No such file or directory
[]

执行ext=.h; ext="$(echo $ext | sed 's/\./\\./')"; echo [$ext]会为[\.h]的实施返回sed

我看过GNU和BSD的sed的手册页没有找到关于尾随“ - ”的任何内容。使用“ - ”搜索sed也不是很有效果。

“ - ”是拼写错误吗? 某些意外值$ext需要“ - ”吗? 问题不在于sed,而在于sh吗?

有人可以指导我看看我应该看到的内容,甚至更好地解释一下“ - ”的目的是什么?

2 个答案:

答案 0 :(得分:1)

在我的系统上,该手册页中没有记录该语法,但它位于 'info'页面:

  

sed OPTIONS ... [SCRIPT] [INPUTFILE ...]

     

如果你没有指定INPUTFILE,或者INPUTFILE是-', sed'   过滤标准输入的内容。

鉴于这种特殊用法,我认为你可以放弃' - '而应该这样做 还在工作。

答案 1 :(得分:0)

你的具体问题得到了回答但是你的脚本都错了。看看这个:

# escape dot in file extension to grep it
ext="$(echo $ext | sed 's/\./\\./')"

主要问题是:

  1. 你没有引用你的变量($ ext)所以它将通过文件名扩展加上如果它包含空格将作为多个参数而不是1传递给echo。请改为:

    ext="$(echo "$ext" | sed 's/\./\\./')"
    
  2. 你正在使用一个外部命令(sed)和一个管道做一些shell本身可以做的事情。这样做:

    ext="${ext/./\.}"
    
  3. 最糟糕的是:您正在转义变量中的RE元字符(。),因此您可以将其传递给grep以对其进行RE搜索,就像它是一个字符串一样 - 这不是在你的变量可以包含RE元字符的任何组合的一般情况下,使任何意义变得棘手。只需进行字符串搜索而不是RE搜索,您无需转义任何内容。不要执行上述任何一个替换命令,然后执行其中任何一个而不是grep "$ext" file

    grep -F "$ext" file
    fgrep "$ext" file
    awk -v ext="$ext" 'index($0,ext)' file