2

我正在将一个显然是使用 GNU 实现编写的 sh 脚本移植sedsed. 脚本中带有原始注释的确切行是:

# 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

有人可以指导我看什么,或者更好地解释“-”的目的是什么?

4

2 回答 2

1

在我的系统上,该语法没有记录在手册页中,但它在“信息”页面中:

sed 选项... [脚本] [输入文件...]

如果您不指定 INPUTFILE,或者如果 INPUTFILE 是-',sed',则过滤标准输入的内容。

鉴于这种特殊用法,我认为您可以省略“-”,它应该仍然有效。

于 2013-02-08T21:31:29.293 回答
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
    
于 2013-02-09T01:13:50.020 回答