2013-02-08 69 views
2

我正在移植一个显然是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的FOL降脂返回:

sed: -: No such file or directory 
[] 

执行ext=.h; ext="$(echo $ext | sed 's/\./\\./')"; echo [$ext]回报[\.h]两个实施sed

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

“ - ”是一个错字吗? “ - ”是否需要一些意想不到的值$ext? 问题不是sed,而是sh

有人可以指引我应该看什么,甚至更好,解释“ - ”的目的是什么?

+1

检查了这一点:http://stackoverflow.com/questions/8045479/whats-the-magic -of-a-dash-in-command-line-parameters – 2013-02-08 21:32:28

回答

1

在我的系统中,语法是不是在手册页中,但它是在 '信息' 页面:

SED选项... [SCRIPT] [INPUTFILE ...]

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

考虑到这种特殊的用法,我认为你可以不用' - '而应该是 仍然有效。

0

你有你的具体问题回答,但你的脚本都是错的。看看这个:

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

的主要问题是:

  1. 你没有引用您的变量($ EXT),因此将通过文件名的扩展和它是否包含空间将被传递给echo为多个参数,而不是1,而是执行此操作:

    ext="$(echo "$ext" | sed 's/\./\\./')" 
    
  2. 您使用的外部命令(SED)和管道做一些壳可以做平凡本身。做到这一点,而不是:

    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 
    
+0

他的脚本没问题。 #1。也许分机没有问题的字符(可能如果它是一个扩展名)。 #2。没有!这不是POSIX(仅限bash)。 #3。 fgrep/grep-F的可移植性也较差,需要很快的运行时检测(请参阅autoconf!中的AC_PROG_FGREP)。你打算写他需要选择的代码..? OP明确写了一个可移植的shell脚本,根本没有提到bash,那么为什么要告诉他用bashisms替换可移植的构造呢? – 2013-03-12 11:20:03

+0

@NicholasWilson - #1 - 希望你不会遇到一个共同的问题是荒谬的,当你可以轻松地写脚本,而不是让问题。 #2 - 正确的说,这个构造在每个shell中都不被支持,如果它在shell中不被支持,他可以比调用外部工具和管道做得更好。 #3 fgrep/grep -F绝对没问题,但是如果你有反对他们的东西,那么使用awk替代方法,因为所有3个替代方法都搜索字符串而不是RE,这很重要,并且根本不需要寻址点2。 – 2013-03-12 14:19:50

+0

@NicholasWilson - 我建议你阅读Chris Johnson的书“Shell Scripting Recipes:A Problem-Solution Approach”(http://www.amazon.com/Shell-Scripting-Recipes-Problem-Solution-Approach/dp/1590594711 )来帮助你理解问题。 – 2013-03-12 14:23:13