假设我有这个变量:
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"
。
这并不能令我满意。有人可以帮忙吗?
无需使用 echo + 管道 + sed。
一个简单的替换变量就足够而且更快:
echo ${DATE//\//\\/}
#> 04\/Jun\/2014:15:54:26
反过来,从反斜杠到斜杠(又名正斜杠)应该是:
echo ${MyVariable//\\//}
使用
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
给你:
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
..
您还可以转义斜线,但其可读性稍差于哈希值:
echo "04/Jun/2014:15:54:26" | sed 's/\//\\\//g'
其他答案中没有提到这一点,所以我想我应该添加一些说明:
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