内容が文字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つの変数を変えることと同じですBASIC
:tmp = a; a = b; b = tmp
;-)
例:
p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo
上記の内容をFOO
行にない文字やテキストに置き換えてください。
答え3
「同時にすべて」ではありませんが、一連の手順を実行できます。
最初のステップは、変更する必要があるすべての項目を表示することです。
2番目のステップは、すべてのタグa
をb
。
3番目のステップは、すべてのタグb
をa
。
だから質問は次のようになります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-a
b