为什么sed的行为会有所不同,具体取决于它是从命令行还是从shell脚本运行?这是一个基本的例子:
$ cat test.txt
foo
bar
baz
$ sed -e 's/^b\(\w*\)$/q\1/g' test.txt # works as intended
foo
qar
qaz
$ cat test.sh # The exact same command
sed -e 's/^b\(\w*\)$/q\1/g' test.txt
$ bash test.sh
foo
bar
baz
现在,当我进一步研究时,\w
不是POSIX正则表达式中的标准BRE或ERE(即使使用-E
标志)字符类。这是RE的类似Perl的GNU扩展,当我从shell脚本运行命令时,这些扩展不起作用。实际上,如果我将\w
更改为POSIX [[:alnum:]]
,它就会按照我的意图运行。没有GNU扩展似乎在shell脚本中起作用(包括大写/小写\U
和\L
)。那么sed
是否会尝试检测它是否从shell脚本运行并进入某种严格的仅POSIX模式?有关于此的文件吗?我可以禁用此行为吗?
(这是gsed (GNU sed) 4.2.2
)
答案 0 :(得分:2)
问题很简单,我有一个长期被遗忘的bash别名,将sed
更改为gsed
- 由Homebrew安装的GNU版本。这解释了为什么sed --version
在命令行中将自己报告为gsed
。我从脚本和提示符中检查了which sed
,但我没有考虑type
和bash别名。
$ type sed
sed is aliased to `gsed'