替换 Bash 中的斜线

问题描述 投票:0回答:5

假设我有这个变量:

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"

这并不能令我满意。有人可以帮忙吗?

regex linux bash tr slash
5个回答
121
投票

无需使用 echo + 管道 + sed。

一个简单的替换变量就足够而且更快:

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

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

反过来,从反斜杠到斜杠(又名正斜杠)应该是:

echo ${MyVariable//\\//}

16
投票

使用

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

9
投票

给你:

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
..


9
投票

您还可以转义斜线,但其可读性稍差于哈希值:

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

8
投票

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

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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.