web-dev-qa-db-ja.com

edの複数の文字を置き換えることはできますか?

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

1
Godpoong

ネイティブではありません。いいえ。sed(y)やPerl(tr///別名y///)-しかし、transliterateコマンド自体でそれを偽造することができます:

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

eコマンドは、ファイルの内容をシェルエスケープコマンドの結果に置き換えます。このコマンドは、aをbに、bをaに音訳し、現在のファイル名を入力として指定します。次に、新しいファイルはwディスクに書き込まれます。次に、quited。

1
Jeff Schaller

CまたはBASICの2つの変数を交換するのと同じように行います:tmp = a; a = b; b = tmp ;-)

例:

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

上記のFOOを、行に表示されていない文字またはテキストに置き換えます。

1
mosvy

「同時に」ではありませんが、一連のステップでそれを行うことができます。

最初のステップは、変更が必要なすべてのものにタグを付けることです。

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つの手順で変更を行うこともできます。最初に、すべてのactrl-Aに変更してから、変更します。すべてのbaに変更してから、すべてのctrl-abに変更します。

1
icarus