我可以替换 ed 中的多个字符吗?

我可以替换 ed 中的多个字符吗?

我有一个文本“ab”,其内容由 a、b 字母组成。我想通过使用 ed 中的 s 命令立即将 a 更改为 b,b 更改为 a。但如果我一步一步地改变它们,如你所知,所有的文本都会变成只有a或只有b。有没有办法同时将a改为b,b改为a?

答案1

y不是原生的,不 - 它缺少您在 sed ( ) 和 perl (tr///又名)中看到的 transliterate 命令y///- 但您可以使用 ansliterate 命令本身来伪造它tr

ed -s input <<< $'e !tr ab ba < %\nw\nq'

e命令用 shell escape 命令的结果替换文件的内容;该命令将 a 音译为 b,将 b 音译为 a,并给出当前文件名作为输入。然后将新文件w写入磁盘;然后我们q编辑。

答案2

C您的操作与在or中交换两个变量的操作相同BASIC: tmp = a; a = b; b = tmp;-)

例子:

p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo

将上面替换FOO为行中未出现的任何字符或文本。

答案3

不是“同时”,但您可以通过一系列步骤来完成。

第一步是标记所有需要更改的内容。

第二步是将所有标记更改ab.

第三步是将所有标记更改ba.

所以问题就变成了how can I tag the things to change?

有一种有趣的技术,它说您可以使用字母a(您想要交换的两个字符之一)来进行标记。

 s/[ab]/a&/g
 s/aa/b/g
 s/ab/a/g

对于这个输入

aaaa aaab aaba aabb abaa abab abba abbb baaa baab baba babb bbaa bbab bbba bbbb

这些步骤产生

aaaaaaaa aaaaaaab aaaaabaa aaaaabab aaabaaaa aaabaaab aaababaa aaababab abaaaaaa abaaaaab abaaabaa abaaabab ababaaaa ababaaab abababaa abababab
bbbb bbbab bbabb bbabab babbb babbab bababb bababab abbbb abbbab abbabb abbabab ababbb ababbab abababb abababab
bbbb bbba bbab bbaa babb baba baab baaa abbb abba abab abaa aabb aaba aaab aaaa

这是期望的结果。

显然,如果已知输入中没有某个字符,例如 ctrl-A,您也可以分 3 步进行更改,先全部更改为actrl-A然后全部更改ba,然后全部更改ctrl-ab

相关内容