用 tr 删除反斜杠

rnd*_*ndy 10 macos bash tr

所以我从文件名中删除特殊字符并用空格替换。除了其中包含单反斜杠的文件之外,我所有的工作都已完成。请注意,这些文件是在 OS X 上的 Finder 中创建的

old_name="testing\this\folder"
new_name=$(echo $old_name | tr '<>:\\#%|?*' ' ');
Run Code Online (Sandbox Code Playgroud)

这导致 new_name 被“测试 hisolder” 我怎样才能删除反斜杠而不是前面的字符?

Rus*_*nov 8

\n

这导致 new_name 被“测试 hisolder”

\n
\n\n

该字符串看起来像 , 的结果echo -e "testing\\this\\folder",因为\\t\\f实际上被制表和换页控制字符替换

\n\n

也许你有一个像这样的别名alias echo=\'echo -e\',或者可能是echo,或者您的 shell 版本中

\n\n
\n

POSIX 不需要支持任何选项,并表示如果任何 STRING 包含反斜杠或第一个参数为 \xe2\,则 \n 行为 \xe2\x80\x98echo\xe2\x80\x99 是实现定义的x80\x98-n\xe2\x80\x99。如果可移植程序需要省略尾随换行符或输出控制字符或反斜杠,则可以使用 \xe2\x80\x98printf\xe2\x80\x99 命令。

\n
\n\n

(来自信息页面)

\n\n

所以你应该使用printf而不是echo在新软件中。特别是,echo $old_name应该替换为printf %s "$old_name".

\n\n

这个讨论中有一个很好的解释例如,

\n\n

不需要printf

\n\n

正如 @mklement0 所建议的,您可以通过Bash here 字符串来避免使用管道来避免使用管道:

\n\n
tr \'<>:\\\\#%|?*\' \' \' <<<"$old_name"\n
Run Code Online (Sandbox Code Playgroud)\n