假设要在包含模式的所有文件中进行编辑。
例如,将所有“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系统上,如果?读取EOF,就会收到ed警告。
您也可以使用here doc:
ed fubar <<EOF
,s/2017/2018/g
w
q
EOF

关于bash - ED HERELINE替代模式失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48328431/

10-12 21:16