【问题标题】:Replace one character with another and vice versa in a string在字符串中用另一个字符替换一个字符,反之亦然
【发布时间】:2018-03-20 02:27:12
【问题描述】:

我想用反斜杠“\”替换所有斜杠“/”,反之亦然。

我幼稚的解决方案是使用 tr 执行此操作,但我需要一个占位符字符,我认为它不是很漂亮:

tr '/' '¢' | tr '\\' '/' | tr '¢' '\\'

这也只有在我的输入中从未出现“¢”时才有效,在我的情况下这很可能就足够了 - 但是嘿,谁知道呢?当然,很容易采用相同的想法并通过使用 sed 使其更健壮,然后将 '¢' 替换为任意随机字符串 - 例如 '½|#&¬_$' 或其他东西。

但我想知道是否有一些单一的 bash 命令来实现这一点,这会使这个东西更短、更易读、更健壮。也许sed 可以开箱即用?


当我们这样做的时候,这个操作的正确名称是什么?像“双向替换”。如果我知道我的谷歌搜索可能会更有成效。我也尝试了“交换字符”,但我只发现了定期替换的东西。

【问题讨论】:

    标签: string bash sed replace tr


    【解决方案1】:

    你不需要中间字符,因为tr 只遍历字符串一次,因此一个字符永远不会被替换超过一次。以下tr 命令应该这样做:

    tr '/\' '\\/' <<< '//\\ then \\// and / and finally a \ in the string'
    

    产量

    \\// then //\\ and \ and finally a / in the string
    

    或者,更简单地说:

    tr ab ba <<< "ab ba bb aa" # yields "ba ab aa bb"
    

    你也可以使用sed:

    sed 'y#/\\#\\/#' <<< '//\\ then \\// and / and finally a \ in the string'
    

    产量

    \\// then //\\ and \ and finally a / in the string
    

    来自man sed

    [2addr]y/string1/string2/

    用 string2 中的相应字符替换模式空间中 string1 中所有出现的字符。 可以使用反斜杠或换行符以外的任何字符代替斜杠来分隔字符串。 在 string1 和 string2 中,后跟“n”的反斜杠被换行符替换。 一对反斜杠被文字反斜杠替换。最后,后跟任何其他字符(换行符除外)的反斜杠就是该文字字符。

    【讨论】:

    • 谢谢!也许您可以在其中添加更一般的事情(我从中学到)是:tr 替换发生在元素方面。在tr ab xy 中,“a”被“x”替换,“b”被“y”替换,因此tr ab ba 将“a”替换为“b”,反之亦然。这是我对tr 遗漏的更普遍的事情。反斜杠的例子有点不幸,因为转义,这真的不是我的意思,而且有点混乱问题(以及答案)。
    • 如果您编辑您的答案并添加上述内容,我将很乐意接受(明天)——它也更适合标题。顺便提一句。我喜欢编辑
    【解决方案2】:
    tr \\\\/ /\\\\
    

    输入:

    //fgdf\\
    

    输出:

    \\fgdf//
    

    为什么是 4 个反斜杠?两个反斜杠在 shell 中构成一个反斜杠,所以tr 接收到\\//\\。它有自己的反斜杠序列,因此它将两个反斜杠解释为一个反斜杠。

    【讨论】:

    • 你的问题Why 4 backslashes?的正确答案是Because I didn't quote my strings appropriately。始终使用单引号引用脚本/字符串,除非您需要双引号来执行特定任务(例如变量扩展),然后始终使用双引号,除非您不需要引号来执行特定任务(例如通配符扩展)。
    • 加引号不比不加引号好,不要让表达更简单,不要加任何东西。
    • 莫顿先生只是接听我,试图在我的任何回答中添加负面评论。这家伙对我的回答非常积极,可能对我有什么不满。
    • 据我所知,我从未听说过您,您只是数百个此类帐户中的一个匿名user&lt;numbers&gt; 帐户,如果我将 cmets 留在了您的任何问题或答案然后他们完全是关于那个问题或答案。您关于Quotes are not better than no quotes, do not make the expression simpler, and do not add anything. 的声明完全错误(仅在此答案中就可以证明!),如果您想了解有关该问题的更多信息,您可以谷歌“引用变量”或阅读任何介绍性的 shell 编程教程。
    猜你喜欢
    • 2022-11-04
    • 2021-06-15
    • 2013-12-03
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多