我收到这个错误
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 标准库的一部分);这种组合对我来说效果很好。