我有一个文本“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
不是“同时”,但您可以通过一系列步骤来完成。
第一步是标记所有需要更改的内容。
第二步是将所有标记更改a
为b
.
第三步是将所有标记更改b
为a
.
所以问题就变成了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 步进行更改,先全部更改为a
,ctrl-A
然后全部更改b
为a
,然后全部更改ctrl-a
为b
。