shell - 为什么 sed 在 shell 脚本中表现不同?

标签 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 标志)字符类。当我从 shell 脚本运行命令时,这些类似于 Perl 的 GNU 扩展对 RE 不起作用。确实,如果我改变\w到 POSIX [[:alnum:]]它按我的意图工作。 shell 脚本中似乎没有 GNU 扩展(包括大写/小写 \U\L )。 sed也是如此尝试检测它是否从 shell 脚本运行并进入某种严格的 POSIX-only 模式?有关于这方面的文件吗?我可以禁用此行为吗?

(这是 gsed (GNU sed) 4.2.2 )

最佳答案

问题只是我有一个久违的 bash 别名更改 sedgsed — 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/

相关文章:

regex - 使用 sed 和 grep/egrep 进行搜索和替换

html - bash 脚本 sed 用变量计数替换图像编号

c# - 使用 C# 正则表达式解析 Linux df 输出

bash - shell脚本(bash)中的${}命令是什么

shell - node js 与 shell 应用程序交互

string - 删除模式之后的所有内容,包括模式

regex - 为什么 sed 不像 awk 那样追加换行符?

linux - 将文本文件中的 block 写入多个新文件

linux - 列出基于 ":"分隔符的 uniq 行

linux - 无法打印进程的PID