【问题标题】:Convert only spaces, not tabs or newlines, with tr使用 tr 只转换空格,而不是制表符或换行符
【发布时间】: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" -- 并在不需要时避免使用 cattr <"$FILE"
  • 另外,tr 不是 bash 的一部分——它是你的操作系统的一部分。 bash 可以启动它,但任何其他能够使用fork()execve() 系统调用的程序也可以。 Bash 有自己的本地方式来运行逐个字符的替换(尽管它们对于大文件并不是特别有效,但如果您只翻译一个合理大小的文件,它们会非常更有效行)。
  • ...但是,错了,是的。 [[:space:]] 是您想要转换 all 空格时使用的;如果要转换常规空格,只需使用常规空格字符即可。
  • ...另外,全大写变量位于命名空间中,用于对 shell 本身和/或其他 POSIX 定义的工具有意义的变量;小写名称保证安全,无需查看您是否错误地覆盖了环境或内置 shell。请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,记住设置 shell 变量会覆盖任何同名环境变量。

标签: unix tr


【解决方案1】:

如果您只想转换常规空格字符,请不要使用[[:space:]](它显式地存在,目的是转换制表符和换行符以及常规空格);只需使用

tr ' ' ',' <"$FILE" >"$NEWFILE"

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多