bash - ed HERELINE 替代模式失败

标签 bash heredoc ed

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

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

相关文章:

php - 使用 heredoc 语法访问字符串中的静态变量的正确方法?

linux - 希望 sed 有一个与 ed 方便的 j 命令等效的命令

XMLStarlet 命名空间定义

linux - 为什么 'ed' 在 linux 中也被命名为 'red'

java - 如何执行 Bash 命令并收集 Java 的输出?

bash - 如何从 Jenkins 控制台日志中删除注释?

php - shell heredoc inside php heredoc

bash - Makefile 将变量传递给 bash 脚本

php - 在 csv 中查找字符串并添加到每一行

php - 访问 HEREDOC 中作为数组的类属性