Mac上的Sed正则表达式问题在Linux上运行良好

Joh*_*ith 16 linux macos sed

这适用于Linux(Debian):

sed -e 's,^[ \t]*psd\(.*\)\;,,' 
Run Code Online (Sandbox Code Playgroud)

在Mac上,我相信我必须使用-E标志,而不是-e:

sed -E 's,^[ \t]*psd\(.*\)\;,,'
Run Code Online (Sandbox Code Playgroud)

但正则表达式不匹配,因此不会删除我想要的行.

关于如何解决这个问题的任何提示?

样本输入:

apa
bepa
    psd(cepa);
depa psd(epa);
  psd(fepa gepa hepa);
Run Code Online (Sandbox Code Playgroud)

对于该输入,预期输出为:

apa
bepa
depa psd(epa);
Run Code Online (Sandbox Code Playgroud)

Mic*_*ber 13

-E标志表示使用扩展正则表达式.你应该-e像在Linux上一样使用它.将sed在Mac OS X是基于BSD sed的,所以不具备GNU扩展.

复制样本输入后:

[~ 507] pbpaste | sed -e 's,^[[:space:]]*psd\(.*\);,,'
apa
bepa

depa psd(epa);
Run Code Online (Sandbox Code Playgroud)

  • `-E`也适用于gnu sed,它是一个无证的选项,他们添加了以符合posix (2认同)

jfg*_*956 8

'\t'没有标准'sed',它是GNU扩展.

要匹配a 'tab',您需要'tab'在脚本中添加一个真实的.这在文件中很容易,在shell中更难.

在AIX,Solaris和HP-UX或其他UNIX中也可能发生同样的问题.

  • 我在答案中错过了.你总是可以使用POSIX字符类,`[[:space:]]`或`[[:blank:]]`可以工作.要获取shell中的文字选项卡,按ctrl-v将为您提供下一个字符的文字. (6认同)

a.b*_*b.d 8

或者,您可以使用sed的GNU版本而不是Mac OSX提供的实现.

Mac端口为它提供了一个端口sudo port install gsed.安装后,您可以使用gsed而不是sed.

  • 或者`brew install gnu-sed --default-names`为酿造人员:) (8认同)
  • 对于那些喜欢@AntonBabenko的人,请注意在最近的版本中不推荐使用`--default-names`.使用`brew install gnu-sed --with-default-names`**然后重新打开终端**. (3认同)
  • Homebrew 的 `--with-default-names` 选项已被弃用。(所以有官方公式的所有选项)。但是您可以通过执行“ln -s /usr/local/bin/gsed /usr/local/bin/sed”来创建自己的别名。但就我个人而言,我不会这样做。某些 shell 脚本可能依赖于内置 BSD `sed` 的行为,因此您可能会遇到一些神秘的问题。 (2认同)