edで複数の文字を変更できますか?

edで複数の文字を変更できますか?

内容が文字aとbで構成される「ab」というテキストがあります。 edでsコマンドを使用してaをbに、bをaにすぐに変更したいと思います。ただし、段階的に変更すると、ご存知のように、すべてのテキストはaまたはbになります。 aをbに、bをaに同時に切り替える方法はありますか?

答え1

yネイティブではありません。tr///sed()とPerl(別名)で見られる音域コマンドが不足していますy///。ただし、ansliterateコマンド自体を使用して偽にすることはできますtr

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

このeコマンドは、ファイルの内容をシェル escape コマンドの結果に置き換えます。このコマンドは a を b に、b を a に翻訳し、現在のファイル名を入力として提供します。その後、新しいファイルがwディスクに書き込まれ、q編集されます。

答え2

Cあなたがすることはorで2つの変数を変えることと同じですBASICtmp = a; a = b; b = tmp;-)

例:

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

上記の内容をFOO行にない文字やテキストに置き換えてください。

答え3

「同時にすべて」ではありませんが、一連の手順を実行できます。

最初のステップは、変更する必要があるすべての項目を表示することです。

2番目のステップは、すべてのタグab

3番目のステップは、すべてのタグba

だから質問は次のようになりますhow can I tag the things to change?

aトークン化に文字(交換したい2つの文字のうちの1つ)を使用できるという興味深い技術があります。

 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-ab

関連情報