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

Mac上的Sed正则表达式问题,在Linux上运行良好,linux,macos,sed,Linux,Macos,Sed,这在Linux(Debian)上运行良好: 在mac上,我相信我必须使用-E标志,而不是-E: sed -E 's,^[ \t]*psd\(.*\)\;,,' 但是regexp不匹配,因此不会删除我想要的行 关于如何解决这个问题有什么建议吗 样本输入: apa bepa psd(cepa); depa psd(epa); psd(fepa gepa hepa); [~ 507] pbpaste | sed -e 's,^[[:space:]]*psd\(.*\);,,' apa

这在Linux(Debian)上运行良好:

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

sed -E 's,^[ \t]*psd\(.*\)\;,,'
但是regexp不匹配,因此不会删除我想要的行

关于如何解决这个问题有什么建议吗

样本输入:

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

depa psd(epa);
对于该输入,预期输出为:

apa
bepa
depa psd(epa);

-E
标志表示使用扩展正则表达式。您应该只使用
-e
,就像在Linux上一样。MacOSX中的
sed
基于BSDSED,因此没有GNU扩展

复制示例输入后:

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

depa psd(epa);

我已经在我的机器上检查了这个示例输入,并在第三行中遇到了问题,第三行是行开头的制表符和regexp
^[\t]*psd\(.*)\与它不匹配。这可以通过sed character class
[[:blank:]
传递,sed character class是空格和制表符的相等组合。因此,您可以尝试以下方法:

sed -E 's,^[[:blank:]]*psd\(.*\)\;,,' demo.txt
sed -n '/^[[:blank:]]*psd\(.*\)\;/!p' demo.txt
这将产生以下输出:

apa
bepa

depa psd(epa);
但它会保留结果中的空行。 为了获得您期望的准确输出,我使用了以下方法:

sed -E 's,^[[:blank:]]*psd\(.*\)\;,,' demo.txt
sed -n '/^[[:blank:]]*psd\(.*\)\;/!p' demo.txt
结果:

apa
bepa
depa psd(epa);
这只是匹配模式的反向输出(
!p


编辑:要匹配sed(macosx)中regexp中的制表符,您也可以尝试从中推荐
'\t'
'sed'
中不是标准的,它是GNU扩展

要匹配一个
'tab'
,您需要在脚本中放入一个真正的
'tab'
。这在文件中很容易,在shell中更难


同样的问题也可能发生在AIX、Solaris和HP-UX或其他Unix中。

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


为它提供一个端口
sudo端口安装gsed
。安装后,您可以使用
gsed
而不是
sed

除了上面的答案之外,您还可以利用一个有用的(但依赖于shell的)技巧。在bash中,使用
$'\t'
引入文本制表符。以下内容在我的Mac电脑上运行:

sed-e's,^['$'\t'*psd\(.*\);,,'

请注意,整个sed表达式现在是如何由三个串联字符串组成的


如果您特别需要制表符,而不需要匹配其他空格(例如,
[[:blank:][]
太包含空格),则此技巧可能非常有用。对于上述内容,-e标志不是必需的。

您的预期输出应该有几行空行。您不需要转义分号。我在回答中没有提到这一点。您可以始终使用POSIX字符类,可以是
[[:space:]
[:blank:]
会起作用。要在shell中获得文本选项卡,按ctrl-v将为下一个字符提供一个文本。或者
brew安装gnu-sed——酿造人的默认名称:)对于喜欢@AntonBabenko的人,只需注意,
--默认名称
在最新版本中被弃用。使用
brew安装gnu-sed——使用default命名
,然后重新打开您的终端。自制的
——默认名称
选项已被弃用。(官方公式上的所有选项也是如此)但是你可以通过执行
ln-s/usr/local/bin/gsed/usr/local/bin/sed
来创建你自己的别名。但我个人不会这么做。一些shell脚本可能依赖于内置BSD
sed
的行为,因此你可能会遇到一些神秘的问题。
-E
也适用于gnu-sed,这是一个未完成的脚本他们添加了一个新选项以符合posix