【问题标题】:Bash parameter expansion delimiterBash 参数扩展分隔符
【发布时间】:2013-05-23 17:40:02
【问题描述】:

我正在尝试使用参数扩展 {1..10} 和模式匹配来获取 1:2:3:4:5:6:7:8:9:10

$ var=$(echo {1..10})
$ echo ${var// /:}
1:2:3:4:5:6:7:8:9:10

有没有更优雅的方式(单线)来做到这一点?

【问题讨论】:

  • 我会使用 read var 而不是 var=$(echo {1..10})
  • 我的首选方式是echo {1..10}|sed 's/ /:/g'

标签: bash parameters


【解决方案1】:

优雅在旁观者的眼中:

( set {1..10} ; IFS=: ; echo "$*" )

【讨论】:

    【解决方案2】:

    同意@choroba 关于优雅的评论,这里有一些其他值得一看的东西:

    # seq is a gnu core utility
    seq 1 10 | paste -sd:
    # Or:
    seq -s: 1 10
    
    # {1..10} is bash-specific
    printf "%d\n" {1..10} | paste -sd:
    
    # posix compliant
    yes | head -n10 | grep -n . | cut -d: -f1 | paste -sd:
    

    【讨论】:

    • 请注意,在标准输入上使用paste 的最便携方式是使用- 参数(例如,在mac 下的BSD 粘贴需要它)。 IE。 paste -sd: -
    • 另一个使用单个外部调用的 POSIX 解决方案:awk 'BEGIN { o = 1; for (i=2; i<11; i++) o = o ":" i; print o }',这是一个根本不需要任何外部调用的 POSIX 解决方案:i=1 o=1; while [ $i -le 9 ]; do o=$o:$((i+=1)); done; echo $o
    【解决方案3】:

    另一种可能性:

    echo {1..9}: 10 | tr -d ' '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多