处理codegolf.se的问题,尝试进行简单的文本替换。
- 给定一个
coin.txt
包含 1 个单词的文件,heads
或者tails
- 我有一个
ed
脚本flip.ed
如下:
s/heads/1/n\
s/tails/-1/n\
wq
.
- 然后我从终端(macos,zsh)执行它,如下:(根据“ Ed Mastery ”,第111章)
[~/golf/ed] λed coin.txt <flip.ed; 猫币.txt 6 ? 尾巴
预计脚本将更tails
改为-1
. 我从 BSD 和 GNU ed (/bin/ed
和/usr/local/bin/ged
, 和 TIO.run )得到了同样的问题。似乎没有一个能够执行多个替换。
这是TIO.run 上的一个示例,我认为它正在运行 GNU ed。
ed
我的脚本有问题吗?或者它是强大的错误ed
?
更新
一个解决方案,由 Twitter 上的@ed1conf提供。使用g
前缀仅在匹配行上进行替换,从而避免破坏我的原始脚本的错误。 在线尝试!
g/heads/s//1/
g/tails/s//-1/
wq
.
您可以这样做,但不能通过重定向或常规文件发送命令。
来自GNU ed 在线手册:
这两个命令之一将失败,因为文件中的单词无法匹配两种模式,因此
ed
退出 - 无论是在第 1 行因为它不匹配,还是在第 2 行因为它不匹配(因此在之前退出)保存更改的文件)。这些命令将通过标准输入工作(减去反斜杠和后缀):
你会得到一个
?
to stderr 因为s/heads/1/
失败(你可以重定向),但替换都按预期发生。请注意,我删除了尾随
.
命令,因为该q
命令足以退出ed
。ed(1) Conference 在 Twitter 上发布的一种解决方法是:
s///
或者,在该部分中没有缩写:这些变体之所以有效,是因为
g
即使没有执行替换,命令也不会失败。,
sed
你可以做到这一点在
ed
中,该t
命令是一个完全不同的命令,并且不会“如果最近的替换做了某事则分支”。使用 GNU
ed
,您可以做到做你的翻转,但它可能在 BSD
ed
中不起作用,因为命令的处理在第一个不匹配的替换处停止,因为(这来自POSIX 标准)
运行此脚本时从 GNU 获得的错误是“不匹配”错误(如果您首先在脚本中
ed
插入命令,则可见),并且可以安全地忽略。H