繁体   English   中英

在 MacOS 上 sed “未定义标签”

[英]sed "undefined label" on MacOS

我最近发现这个简单的sed表达式在 Linux 或 Cygwin 下运行良好,但在 Mac 上失败并出现“未定义标签”错误:

$ sed '/SUCCESSFUL/d ; /\[java\]/!b label; s/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d; :label /^\s*$$/d; s/^/monitor: /'
sed: 1: "/SUCCESSFUL/d ; /\[java ...": undefined label 'label; s/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d; :label /^\s*$$/d; s/^/monitor: /'

MacOS 上的sed是 BSD 变体,其选项与 GNU 对应物不同。 但是man sed明确指出 MacOS 版本的sed支持标签,那么为什么会出现这个错误,最重要的是如何解决呢?

标签的名称以第一个文字换行符结束,而不是以分号结尾。 有两种简单的方法可以解决问题。 添加文字换行符:

 sed '/SUCCESSFUL/d 
    /\[java\]/!b label
    s/\s\+\[java\]//
    /^\s*$$/d; /Compiling/!d
    :label
    /^\s*$$/d
    s/^/monitor: /'

或者使用多个-e选项:

sed -e '/SUCCESSFUL/d ; /\[java\]/!b label' \
  -e 's/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d' \
  -e':label' -e'/^\s*$$/d; s/^/monitor: /'

在SO上有很多类似的问题,但大多数是由于-i在平台之间的行为不同,所以这是不同的。

在这种情况下,问题很简单:似乎标签引用只能在sed的BSD版本中倒退,而GNU版本允许使用前向引用。 那是在MacOS上, :label必须出现 b label 之前

解决方案是重写表达式以在分支之前定义标签,或者在上面的表达式的情况下,实现分支是一种“如果这种模式不存在......向前跳”。 在这种情况下,表达式可以扩展为首先不需要标签:

sed '/SUCCESSFUL/d ; /\s+\[java\]\s*/d; /\[java\]/s/\s\+\[java\]//; /Compiling/!d; /^\s*$$/d; s/^/monitor: /'

对于有类似问题的其他人(在MacOS 上)的快速修复可能是:

在你的字符串表达式前面加上一个空字符串: ''

例如:代替

sed -i 's/foo/bar/g' text.txt

写:

sed -i '' 's/foo/bar/g' text.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM