彼此替换两个字符串


9

我想用另一个字符串(例如string2)来改变一个字符串(例如string1)的所有出现,反之亦然。确切地说,我有一个很长的文档,这些字符串多次出现。我目前要做的是替换string1-> string3,然后替换string2-> string1,最后替换string3-> string2。

我想知道emacs中是否已经有执行此操作的功能。欢迎其他解决方案。

编辑:这实际上是注释中链接的问题的重复项。但是问题在于,该问题的公认答案并不总是有效(请参见下面的评论)。我认为最好等到该已接受答案的作者更正他/她的答案或提出其他解决方案。其次,在发布我的问题之前,我用谷歌搜索了该问题,但未显示该问题。我认为有时会有两个重复的问题很有用,因为它们使用不同的措词,并且如果用户找到重复的问题,他/她就可以找到正确的问题。

编辑2:现在可以接受的类似搜索/替换功能的交换文本的答案。



@ T.Verron我尝试使用您链接的可接受答案将暂存缓冲区中的“ This”替换为“ that”,但它不起作用。
命名

也许我接受得太快了。在()的调用中注释掉最后两个参数(backwardsregion-noncontiguous-pperform-replace使它在这里起作用(emacs 24.3)。在编辑其他答案之前,我会在emacs 25上对其进行测试。
T. Verron '16

相比之下,@ T.Verron是另一种建议使用plur软件包的解决方案。在这种情况下似乎可以正常工作。
命名

我在另一个问题中更改了接受的答案。关于google,是的,我也很难找到关键字来传达自己的意图。是的,重复项很好!blog.stackoverflow.com/2010/11/...
T. Verron

Answers:


11

对于交互式案例,query-replace-regexp(CM-%)可以使用相对未知的\进行替换。

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

如果替换文本包含\,后跟一个lisp表达式,它将使用该表达式的值作为替换。在这种情况下,表达式是一个“ if”,它接受条件以及对true和false情况的返回值。

建议在评论中使用

\,(如果\ 1“ string2”“ string1”)

之所以可行,是因为如果模式与string1匹配,\ 1将为“ string1”,否则为nil。Lisp将任何非nil值都设为true。尽管此方法有效且时间较短,但我认为我的回答更有用。我认为该代码对于口齿不清的人来说更具可读性。它具有第二个优点,因为如果将“ from”模式指定为

\(string1\|string2\)

甚至

string1\|string2

2
重复候选者中的一些注释\,(if \1 "string2" "string1")使用regexp 提出了更简单的语法\(string1\)\|string2
T. Verron

请参阅的最后两段(emacs) Regexp Replace
罗勒

-1

好吧,也许有了一个宏就很容易了:

F3C-saRETC-bM-tF4。在您的问题上使用此宏会产生以下结果:

我想将所有出现的字符串a(例如string1)更改为另一个字符串(例如string2),反之亦然。确切地说,我有很长的文档,这些字符串多次出现。我目前要做的是替换string1-> string3,然后替换string2-> string1,最后替换string3-> string2。

我想知道emacs中是否已经有执行此操作的功能。欢迎其他解决方案。

我要在an之后的a单词和该单词之间转换位置。您以后可以编辑此类宏以转置其他单词,而无需重新定义整个宏,您可以使用来编辑宏C-xC-kRET


1
我认为这个问题与移调单词无关。
T. Verron

@ T.Verron确实如此,但是他似乎想要一种更自动化的方法。
shackra

1
您的宏所做的是将每个“ a”与下一个单词交换(换位)。“字符串”>“字符串a”等。他要执行的操作是,例如,将每个“ a”替换为“ the”,将每个“ the”替换为“ a”。
T. Verron '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.