内容がa、b文字で構成されているテキスト「ab」があります。 edでsコマンドを使用して、aをbに、bをaに一度に変更したい。しかし、ご存知のように、段階的に変更すると、すべてのテキストがaのみまたはbのみに変更されます。 aをbに、bをaに同時に変更する方法はありますか?
ネイティブではありません。いいえ。sed(y
)やPerl(tr///
別名y///
)-しかし、tr
ansliterateコマンド自体でそれを偽造することができます:
ed -s input <<< $'e !tr ab ba < %\nw\nq'
e
コマンドは、ファイルの内容をシェルエスケープコマンドの結果に置き換えます。このコマンドは、aをbに、bをaに音訳し、現在のファイル名を入力として指定します。次に、新しいファイルはw
ディスクに書き込まれます。次に、q
uited。
C
またはBASIC
の2つの変数を交換するのと同じように行います:tmp = a; a = b; b = tmp
;-)
例:
p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo
上記のFOO
を、行に表示されていない文字またはテキストに置き換えます。
「同時に」ではありませんが、一連のステップでそれを行うことができます。
最初のステップは、変更が必要なすべてのものにタグを付けることです。
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
に変更します。