为什么sed在shell脚本中的行为方式不同?

时间:2016-10-21 18:25:48

标签: shell sed

为什么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

1 个答案:

答案 0 :(得分:2)

问题很简单,我有一个长期被遗忘的bash别名,将sed更改为gsed - 由Homebrew安装的GNU版本。这解释了为什么sed --version在命令行中将自己报告为gsed。我从脚本和提示符中检查了which sed,但我没有考虑type和bash别名。

$ type sed
sed is aliased to `gsed'
相关问题