【问题标题】:How to replace one character with two characters using tr如何使用 tr 将一个字符替换为两个字符
【发布时间】:2013-08-21 18:55:34
【问题描述】:

可以用两个字符替换一个字符吗?

我正在尝试将“~”替换为“~\n”,但输出不会产生换行符。

$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345

【问题讨论】:

    标签: shell unix tr


    【解决方案1】:

    不,tr 专门用于将单个字符替换为单个字符(或者,根据命令行选项,删除字符或将单个字符的运行替换为一次。)。

    sed 可能是完成这项特殊工作的最佳工具:

    $ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
    asdlksad ~
     adlkajsd ~
     12345
    

    (请注意,这需要sed 将反冲-n \n 序列解释为换行符。GNU sed 会这样做,但 POSIX 不会指定它,除非在正则表达式中,而且肯定有旧版本的 sed 没有。)

    【讨论】:

      【解决方案2】:

      您可以使用 awk,让 FS/OFS 变量为您完成这项工作:

      awk -F'~' -v OFS="~\n" '$1=$1' 
      

      用你的例子测试:

      kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345" 
      asdlksad ~
       adlkajsd ~
       12345
      

      【讨论】:

      • 这为我解决了一个问题,但我不清楚发生了什么,所以为了清楚起见,我挖得更深一点:“-F”==“输入字段分隔符”和“- OFS” == “输出字段分隔符”(这里的技巧是“OFS”可以是多字符)和“
      【解决方案3】:

      tr只能进行1对1翻译。

      这是一种使用纯 Bash 的方法:

      s='"asdlksad ~ adlkajsd ~ 12345'
      r=$'~\n'
      echo -e "${s//\~/$r}"
      asdlksad ~
       adlkajsd ~
       12345
      

      【讨论】:

      【解决方案4】:

      没办法,抱歉。

      tr 是一个字符与另一个字符的音译。

      有很多选择,但我会使用awk,即

      echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
      

      输出

      asdlksad ~
       adlkajsd ~
       12345
      

      【讨论】:

      • 代替/[~]/,更短的形式/~/ 也可以使用。最后的;1 不是必需的。 (或者,对于一些不起眼的旧操作系统?)
      【解决方案5】:
      echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
      

      --这将完美运行,因为 sed 在替换 \n

      时遇到问题

      【讨论】:

      • 如果输入在别处包含|则不起作用。
      猜你喜欢
      • 2021-02-26
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2011-12-21
      • 2017-01-04
      相关资源
      最近更新 更多