【发布时间】:2018-09-04 15:06:00
【问题描述】:
我正在尝试在 bash 脚本中通过替换空格来转换一行代码,并且仅将空格字符替换为“,”逗号字符。我不希望制表符或换行符受到影响。
我有有效的代码:
cat $FILE | tr '\t' '@' | tr '\n' '%' | tr '[:space:]' ',' | tr '@' '\t' | tr '%' '\n' > $NEWFILE
但显然这并不优雅。我知道必须有一种方法可以在不涉及换行符或制表符的情况下仅识别空格 ' ' 字符。这样我就不必将这些字符转换为其他字符然后再返回。
有什么想法吗?
【问题讨论】:
-
您只是在寻找
tr ' ' ','吗? -
顺便说一句,
cat $FILE会自行引入所有错误。始终引用您的扩展:cat "$FILE"-- 并在不需要时避免使用cat:tr <"$FILE"。 -
另外,
tr不是 bash 的一部分——它是你的操作系统的一部分。 bash 可以启动它,但任何其他能够使用fork()和execve()系统调用的程序也可以。 Bash 有自己的本地方式来运行逐个字符的替换(尽管它们对于大文件并不是特别有效,但如果您只翻译一个合理大小的文件,它们会非常更有效行)。 -
...但是,错了,是的。
[[:space:]]是您想要转换 all 空格时使用的;如果要转换常规空格,只需使用常规空格字符即可。 -
...另外,全大写变量位于命名空间中,用于对 shell 本身和/或其他 POSIX 定义的工具有意义的变量;小写名称保证安全,无需查看您是否错误地覆盖了环境或内置 shell。请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,记住设置 shell 变量会覆盖任何同名环境变量。