在Bash中替换斜杠

use*_*447 26 regex linux bash slash tr

让我们假设我有这个变量:

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

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

Luc*_*ier 59

无需使用echo + a pipe + sed.

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

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

#> 04\/Jun\/2014:15:54:26
Run Code Online (Sandbox Code Playgroud)

  • 刚刚想通了,这种方法确实有效。您需要确保在变量名称后使用两个正斜杠。所以,在我的例子中,`${FileDirRelativeToProjectRoot//\\//}`。否则,它只会替换第一个。有点微妙... (4认同)

Ken*_*ent 9

干得好:

kent$  echo "04/Jun/2014:15:54:26"|sed 's#/#\\/#g'  
04\/Jun\/2014:15:54:26
Run Code Online (Sandbox Code Playgroud)

你的tr路线不正确,你可能会误解什么trtr 'abc' 'xyz'会改变a->x, b->y, c->z,而不是整体改变abc->xyz..


mig*_*rin 9

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

echo "04/Jun/2014:15:54:26" | sed 's/\//\\\//g'
Run Code Online (Sandbox Code Playgroud)


n34*_*nda 7

使用SED替换:

 sed 's#/#\\/#g' < filename.txt > newfilename.txt
Run Code Online (Sandbox Code Playgroud)

你通常使用"/"代替"#",但只要它在那里就没关系.

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

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

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
Run Code Online (Sandbox Code Playgroud)


Ale*_*x M 7

其他答案中没有提到这一点,所以我想补充一些说明:

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
Run Code Online (Sandbox Code Playgroud)

当用于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
Run Code Online (Sandbox Code Playgroud)