如何在sed解释器脚本的shebang中使用Posix扩展正则表达式?

时间:2010-12-31 16:22:03

标签: regex shell sed

我写了一个sed解释器脚本:

#!/usr/bin/sed -E -f
s/ +/_/g
s/[.':]//g
s/&/and/g

然而,当我运行它时:

$ echo "Bob Dylan" | shscrub.sed
sed: unknown option --  
usage: sed [-aEnru] command [file ...]
       sed [-aEnru] [-e command] [-f command_file] [file ...]

我需要-E选项,因为我使用的是扩展正则表达式语法'+'。

任何想法我做错了什么?

修改

解决方法:

#!/usr/bin/sed -f
s/ \{1,\}/_/g
s/[.':]//g
s/&/and/g

但是,我仍然想知道如何在shebang(#!)行中传递两个参数。

3 个答案:

答案 0 :(得分:3)

错误消息说空格字符不是一个选项。所以我想,你需要在shebang中将所有参数混合在一起:

#!/usr/bin/sed -Ef
s/ +/_/g
s/[.':]//g
s/&/and/g

奇怪,因为这很好用:

$ echo "Bob  Dylan" | sed -E -f ~/bin/shscrub.sed
Bob_Dylan

答案 1 :(得分:1)

使用OSX 10.6上的默认sed;

[~]> echo "Bob Dylan"|./test.sed
Bob_Dylan

使用普通sh也可以;

[~]> sh -c "echo \"Bob Dylan\" | ./test.sed" 
Bob_Dylan

更新:确实不能与Gnu sed一起使用,似乎是兼容性问题。

如果您不使用GNU sed参数,则-f有效,请注意您必须使用-r代替-E;

[~]> echo "Bob Dylan"|sed -r "s/ +/_/g;s/[.':]//g;s/&/and/g" 
Bob_Dylan

答案 2 :(得分:1)

问题是shebang #!多个CLI参数被Linux内核通过binfmt_misc视为单个'-E -f'参数:https://stackoverflow.com/a/1667855/895245

正如在How to use multiple arguments with a shebang (i.e. #!)?中提到的那样,除了使用包装器之外,似乎没有什么好方法可以解决这个问题。

既然您提到了POSIX,请注意,POSIX 7中没有提到-Ehttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html