【问题标题】:Why does sed behave differently in a shell script?为什么 sed 在 shell 脚本中的行为不同?
【发布时间】: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。

标签: shell sed


【解决方案1】:

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

$ type sed
sed is aliased to `gsed'

【讨论】:

  • 我遇到了同样的问题,忘记了别名!谢谢!
猜你喜欢
  • 2020-04-02
  • 2016-05-07
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 2014-05-15
  • 2014-10-06
  • 1970-01-01
相关资源
最近更新 更多