2

假设您要对包含模式的所有文件进行编辑。例如,将所有“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
4

1 回答 1

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
于 2018-01-18T19:09:35.323 回答