2つの文字列を互いに置き換える


9

文字列(たとえばstring1)のすべての出現箇所を別の文字列(たとえばstring2)に変更したいと思います。逆も同様です。正確には、私は長いドキュメントを持っていますが、これらの文字列は何度も発生します。私が現在行っていることは、string1-> string3、次にstring2-> string1、最後にstring3-> string2を置き換えることです。

これを行う関数がemacsにすでにあるかどうか疑問に思っています。他の解決策も歓迎します。

編集:これは実際にはコメントにリンクされている質問の複製です。しかし問題は、その質問の受け入れられた回答が常に機能するとは限らないことです(以下のコメントを参照)。その受け入れられた答えの作者が彼/彼女の答えを訂正するか、または他の解決策が出るまで待つ方が良いと思います。次に、質問を投稿する前に、質問をグーグルで検索したところ、その質問が表示されませんでした。重複する質問が2つあると便利な場合があります。これは、異なる表現を使用しており、ユーザーが重複した質問を見つけた場合、正しい質問を見つけることができるためです。

編集2:テキストを交換するため検索/置換のような機能の受け入れられた答えは今や問題ないようです。



@ T.Verronスクラッチバッファで、リンクの受け入れられた回答を使用して「This」を「that」に置き換えようとしましたが、機能しません。
名前

多分私はあまりにも速く受け入れました。の呼び出しで最後の2つの引数をコメントアウト(backwardsおよびregion-noncontiguous-p)すると、perform-replaceここで機能します(emacs 24.3)。他の回答を編集する前に機会があったら、emacs 25でテストします。
T.ヴァーロン

対照的に@ T.Verron、パッケージプルーの使用を提案する他のソリューション。この状況で問題なく動作しているようです。
名前は

他の質問の回答を変更しました。グーグルに関しては、はい、私も私がやろうとしていたことを伝えるためのキーワードを見つけるのに苦労しました。そして、はい、重複は良いです!blog.stackoverflow.com/2010/11/...
T. Verron

回答:


11

対話型の場合、query-replace-regexp(CM-%)は、比較的未知の\を使用して置換を行うことができます。

C-M-% \(string1\)\|\(string2\)
\,(if (equal \& "string1") "string2" "string1")

置換テキストに\が含まれ、その後にlisp式が続く場合、その式の値を置換として使用します。この場合、式は「真」と偽の場合の条件と戻り値を取る「if」です。

コメントで使用することをお勧めします

\、(if \ 1 "string2" "string1")

これは、パターンがstring1と一致する場合は\ 1が "string1"になり、そうでない場合はnilになるため機能します。Lispは、nil以外の値をすべてtrueとして受け取ります。これは機能し短くなりますが、私の答えの方が便利だと思います。lispの知識が限られている人にとっては、コードの方が読みやすいと思います。「from」パターンが次のように指定されている場合でも機能するため、2番目の利点があります。

\(string1\|string2\)

あるいは

string1\|string2

2
重複候補のコメントの中には\,(if \1 "string2" "string1")、正規表現を使用したより簡単な構文を提案するものがあります\(string1\)\|string2
T. Verron、2016年

の最後の2つの段落を参照してください(emacs) Regexp Replace
バジル

-1

まあ、おそらくマクロがあればこれは簡単でしょう:

F3C-saRETC-bM-tF4。質問にこのマクロを使用すると、次の結果が得られます。

文字列a(たとえばstring1)のすべての出現箇所を別の文字列(たとえばstring2)で変更したいと思います。逆も同様です。正確には、私は長いドキュメントを持っていて、これらの文字列は何度も発生します。私が現在行っていることは、string1-> string3、次にstring2-> string1、最後にstring3-> string2を置き換えることです。

これを行う関数emacsがすでにあるかどうか疑問に思っています。他の解決策も歓迎します。

後にあるa単語とその単語の間の位置を入れ替えています。後でそのようなマクロを編集して、マクロ全体を再定義する必要なく他の単語を転置することもできますC-xC-kRET。マクロを編集するには、を使用します。


1
質問は単語の転置に関連しているとは思いません。
T. Verron、2016年

@ T.Verronそうですが、彼はもっと自動化されたアプローチを望んでいるようです。
shackra 2016年

1
マクロが行うことは、各 "a"を次の単語と交換(転置)することです。"a string"> "string a"など。彼がやりたいことは、たとえば、各 "a"を "the"に、各 "the"を "a"に置き換えることです。
T.ヴェロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.