假设您要在包含模式的所有文件中进行编辑。 例如,更改所有' 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
答案 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