ed HERELINE 替换模式失败

ed HERELINE substitute pattern fails

假设您要对所有包含模式的文件进行编辑。 例如,将所有“2017”更改为“2018”。 存在许多针对 perl、sed 和各种其他的建议。 ed 编辑器要简单得多,如果它可以工作的话。

给定一个文件:

$ echo 2017 > fubar

为什么这不起作用

$ ed fubar <<< ',s/2017/2018/g\nw\n'
6
?
$ cat fubar
2017
$ 

当这样做时

$ printf ',s/2017/2018/g\nw\n'|ed fubar
6
7
$ cat fubar
2018
$ 

最后会这样循环使用

$ for i in `grep -r -l 2018`; do ed $i <<< ',s/2017/2018/g\nw\n'; done

printf\n 转义序列转换为换行符。在 shell 中的普通字符串中没有这样的翻译,并且 ed 本身也无法识别它,因此无法理解并且会出错。

您可以使用 bash $'...' 字符串来执行转义序列转换。

ed fubar <<< $',s/2017/2018/g\nw\nq\n'

我还在末尾添加了一个明确的 q 命令。在我的 Mac OS 系统上,如果 ed 读取 EOF,我会收到 ? 警告。

您也可以使用此处文档:

ed fubar <<EOF
,s/2017/2018/g
w
q
EOF