我写了一个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(#!)行中传递两个参数。
答案 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中没有提到-E
:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html