ed HERELINE替代模式失败

时间:2018-01-18 18:53:56

标签: bash heredoc ed

假设您要在包含模式的所有文件中进行编辑。 例如,更改所有' 2017'至' 2018'。 对于perl,sed和其他各种存在许多建议。 如果可以使ed编辑器工作,那么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

1 个答案:

答案 0 :(得分:4)

printf\n转义序列转换为换行符。在shell中的普通字符串中没有这样的翻译,并且ed也不会自己识别它,因此不理解并且你会得到错误。

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

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

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

你也可以使用here-doc:

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