我最近发现这个简单的sed表达式在Linux或Cygwin下工作正常但在Mac上出现"undefined label"错误:
$ 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: /'
Run Code Online (Sandbox Code Playgroud)
sed在MacOS上是一个BSD变体,具有与GNU对应的不同选项.但是man sed明确指出MacOS版sed支持标签,那么为什么会出现这个错误,最重要的是如何解决呢?
dop*_*xxx 35
一个快速修复方法是在字符串表达式前面添加一个空字符串:''
例如:代替
sed -i 's/foo/bar/g' text.txt
Run Code Online (Sandbox Code Playgroud)
写:
sed -i='' 's/foo/bar/g' text.txt
Run Code Online (Sandbox Code Playgroud)
这应该适用于不同的操作系统(Linux、MacOS、Windows)
标签名称以第一个文字换行符结尾,而不以分号结尾。有两种简单的方法可以解决问题。添加文字换行符:
sed '/SUCCESSFUL/d
/\[java\]/!b label
s/\s\+\[java\]//
/^\s*$$/d; /Compiling/!d
:label
/^\s*$$/d
s/^/monitor: /'
Run Code Online (Sandbox Code Playgroud)
或使用多个-e选项:
sed -e '/SUCCESSFUL/d ; /\[java\]/!b label' \
-e 's/\s\+\[java\]//; /^\s*$$/d; /Compiling/!d' \
-e':label' -e'/^\s*$$/d; s/^/monitor: /'
Run Code Online (Sandbox Code Playgroud)
SO 上有很多类似的问题,但大多数都是由于-i平台之间的行为不同,所以这是不同的。
在这种情况下,问题相当简单:似乎标签引用在 BSD 版本中只能向后引用sed,而 GNU 版本允许使用前向引用。也就是说,在 MacOS 上,必须:label出现在.b label
解决方案是重写表达式以在分支之前定义标签,或者在上面的表达式的情况下实现分支是一种“如果此模式不存在......向前跳转”。在这种情况下,表达式可以扩展为首先不需要标签:
sed '/SUCCESSFUL/d ; /\s+\[java\]\s*/d; /\[java\]/s/\s\+\[java\]//; /Compiling/!d; /^\s*$$/d; s/^/monitor: /'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5942 次 |
| 最近记录: |