将一个字符替换为另一个字符,反之亦然

时间:2017-10-08 23:07:32

标签: string bash sed replace tr

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

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

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

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

但是我想知道是否有一些单一的bash命令来实现这一目标,这将使这个东西变得更短,更具可读性和更强大。也许sed可以开箱即用吗?

虽然我们在这,但这个操作的正确名称是什么?像'双向替换'。如果我知道我的谷歌搜索可能会更有成效。我也试过'交换字符',但我只找到了定期更换的东西。

2 个答案:

答案 0 :(得分:5)

你不需要一个中间字符,因为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 /字符串1 /字符串2 /

     

将模式空间中string1中出现的所有字符替换为string2中的相应字符。     可以使用除反斜杠或换行符之外的任何字符而不是斜杠来分隔字符串。     在string1和string2中,反斜杠后跟一个“n&#39;&#39;由换行符替换。     一对反斜杠替换为字面反斜杠。最后,反斜杠后跟任何其他字符(换行符除外)是字面字符。

答案 1 :(得分:1)

tr \\\\/ /\\\\

输入:

//fgdf\\

输出:

\\fgdf//

为什么有4个反斜杠?两个反斜杠在shell中生成一个反斜杠,因此tr会收到\\//\\。它有自己的反斜杠序列,因此它将两个反斜杠解释为后端。