在Bash中替换斜杠

时间:2014-06-06 08:45:28

标签: regex linux bash tr slash

我们假设我有这个变量:

DATE="04/Jun/2014:15:54:26"

其中我需要将/替换为\/以获取字符串:

"04\/Jun\/2014:15:54:26"

我尝试tr如下:

echo "04\Jun\2014:15:54:26" | tr '\' '\\/'

但结果是:"04\Jun\2014:15:54:26"

它不满足我。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:52)

无需使用echo + a pipe + sed。

一个简单的替换变量就足够快了:

echo ${DATE//\//\\/}

#> 04\/Jun\/2014:15:54:26

答案 1 :(得分:6)

使用SED进行替换:

 sed 's#/#\\/#g' < filename.txt > newfilename.txt

您通常使用“/”代替“#”,但只要它在那里就没关系。

我在Windows PC上写这个,所以我希望它是对的,你可能不得不用另一个斜线来逃避斜线。

Sed解释说,“ - e”允许你编辑文件。您可以使用-i自动创建备份。

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

答案 2 :(得分:3)

你去:

kent$  echo "04/Jun/2014:15:54:26"|sed 's#/#\\/#g'  
04\/Jun\/2014:15:54:26

您的tr行不正确,您可能会误解tr的行为,tr 'abc' 'xyz'会更改a->x, b->y, c->z,而不会更改整个abc->xyz

答案 3 :(得分:0)

您还可以通过使用比散列略少可读的解决方案来逃脱斜线:

echo "04/Jun/2014:15:54:26" | sed 's/\//\\\//g'

答案 4 :(得分:0)

这没有在其他答案中提到,所以我想我要添加一些说明:

tr使用两组字符进行替换,并且第一组中的字符以一对一的方式替换为第二组中的字符。手册页指出

  

SET2通过根据需要重复其最后一个字符而扩展到SET1的长度。 SET2的多余字符将被忽略。

示例:

echo abca | tr ab de    # produces decd
echo abca | tr a de     # produces dbcd, 'e' is ignored
echo abca | tr ab d     # produces ddcd, 'd' is interpreted as a replacement for 'b' too

在使用sed进行替换时,可以使用'/'以外的其他字符作为分隔符,这将使您的表达式更加清晰(我喜欢使用':',@ n34_panda在回答中建议使用'#' )。别忘了使用/g修饰符替换所有出现的情况:sed 's:/:\\/:g'带引号,或者sed s:/:\\\\/:g不带引号(反斜杠必须转义两次)。

最后,最短的解决方案可能是@ Luc-Olivier的答案,其中涉及替换,格式如下(不要忘了在期望模式的一部分时也转义正斜杠):

echo ${variable/expected/replacement}     # will replace one occurrence
echo ${variable//expected/replacement}    # will replace all occurrences