【发布时间】:2016-10-21 18:25:47
【问题描述】:
为什么 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 标志)字符类。当我从 shell 脚本运行命令时,这些 REs 的类似 Perl 的 GNU 扩展不起作用。事实上,如果我将 \w 更改为 POSIX [[:alnum:]],它会按我的意图工作。似乎没有 GNU 扩展在 shell 脚本中起作用(包括大写/小写 \U 和 \L)。那么sed 是否会尝试检测它是否从 shell 脚本运行并进入某种严格的仅限 POSIX 模式?有这方面的文件吗?我可以禁用此行为吗?
(这是gsed (GNU sed) 4.2.2)
【问题讨论】:
-
无法复制。使用 MSYS Windows 10 & sed 4.2.2 & 你的测试数据。我从命令行或 shell 得到了正确的结果。
-
哦,我发现了差异。很久以前,我在
~/.bash_profile中将sed别名为gsed。我之前验证过which sed,但我没有仔细检查type sed。