如何在 osx 上的 sed 中使用内容地址而不出现错误“预期上下文地址”

如何在 osx 上的 sed 中使用内容地址而不出现错误“预期上下文地址”

我收到这个错误

sed: 2: "
/^[[:space:]]*pause$/, ...": expected context address

用这一行:

/^[[:space:]]*pause$/,+1d

它适用于我的 Debian Ubuntu 系统。

完整文件是

file_in=$1
sed -e'
#
# Delete whole lines
/^<?xml/d
/^<[!]DOCTYPE/d
/^<\(.*html\|.*head\|meta\|.*body\)/d
/^<\(.*table\|.*head\|meta\|.*body\)/d
/^[[:space:]]*<[/]*tr.*>$/d
/storeConfirmation/d
#
# Remove pieces of a line
s/<td>//
s%</*td.*>%%
#
# Replacements - chunks
/^<link/ {
  s/<link rel="selenium.base" href/@link/
  s%[[:space:]]*/>%%
}
/^<title/ {
  s/<title>/feature "/
  s%</title>%" do%
}
/^.*>>>>> / {
  s/^.*>>>>>[[:space:]]*/scenario "/
  s/$/ do/
}
s/-->/"/
s/^.*<<<<<.*/end/
s/<[!]--/#/
/^#/ {
  s/^##/#/
  s/"$//
}
#
# Replacements - characters
/\${/ {
  s/\$/@/g
  s/{//g
  s/}//g
}
s/^[[:space:]]*//
/^[[:space:]]*$/d' $file_in |
sed -e'
/^[[:space:]]*pause$/,+1d
/deleteAllVisibleCookies/d
/click\|wait\|assert/ {
  N;
  s/\n/ /
}
/@.*@/ {
  s/@/+ @/2
}
/select\|type/ {
  N;
  N;
  s/\n/ /g
}
$ a end
'

输入样本

<tr>
        <td>waitForVisible</td>
        <td>${css_delete_violation}</td>
        <td></td>
</tr>
<tr>
        <td>click</td>
        <td>${css_delete_violation}</td>
        <td></td>
</tr>
<tr>
        <td>storeConfirmation</td>
        <td></td>
        <td></td>
</tr>
<tr>
        <td>pause</td>
        <td>2000</td>
        <td></td>
</tr>

我也尝试过:

/^[[:space:]]*pause$/0,+1d
/^[[:space:]]*pause$/1,+1d
/^[[:space:]]*pause$/+1d
/^[[:space:]]*pause$/1d
/^[[:space:]]*pause$/1,2d

但他们都给出了无效的命令代码

我也尝试过:

...
sed -E '
/^[[:space:]]*pause$/,+1d
...

答案1

Linux 通常有 GNU sed,OS X 使用 BSD 的 sed。地址 '/pattern/,+1' 是 GNU 扩展,它不能与其他 sed 实现一起使用。

可能有效的方法如下(将一行与下一行连接,然后删除该行):

/pattern$/N; /pattern/d

至少在 OS X 10.10 上是有效的。注意不同的模式。

由于您的目标是操作 XML 文件,因此 sed 并不是合适的工具。例如,看看 Python 及其 lxml 模块(不是 Python 标准库的一部分);这种组合对我来说效果很好。

相关内容