为什么 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 脚本运行命令时,这些类似于 Perl 的 GNU 扩展对 RE 不起作用。确实,如果我改变\w
到 POSIX [[:alnum:]]
它按我的意图工作。 shell 脚本中似乎没有 GNU 扩展(包括大写/小写 \U
和 \L
)。 sed
也是如此尝试检测它是否从 shell 脚本运行并进入某种严格的 POSIX-only 模式?有关于这方面的文件吗?我可以禁用此行为吗?(这是
gsed (GNU sed) 4.2.2
)
最佳答案
问题只是我有一个久违的 bash 别名更改 sed
至 gsed
— Homebrew 安装的 GNU 版本。这解释了为什么sed --version
报告自己为 gsed
在命令行。我查过 which sed
从脚本和提示,但我没想到type
和 bash 别名。
$ type sed
sed is aliased to `gsed'
关于shell - 为什么 sed 在 shell 脚本中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40183218/