【问题标题】:How do you parse a filename in bash?如何在 bash 中解析文件名?
【发布时间】:2010-09-08 03:26:03
【问题描述】:

我的文件名格式如下:

system-source-yyyymmdd.dat

我希望能够使用“-”作为分隔符来解析文件名的不同位。

【问题讨论】:

    标签: bash shell parsing tokenize cut


    【解决方案1】:

    您可以使用cut command 来获取 3 个“字段”中的每一个,例如:

    $ echo "system-source-yyyymmdd.dat" | cut -d'-' -f2
    source
    

    “-d”指定分隔符,“-f”指定你需要的字段编号

    【讨论】:

    • 我很好奇你为什么添加了#提示符。通常,该提示指示 root 或超级用户。一般来说,我认为像尝试 cut 命令这样的事情作为普通用户会更好。我会使用 $ 提示符。
    • 哦,是的 - 好点。我必须承认,当时我是以 root 身份登录的,只是简单地去做了——我知道这是一个坏习惯。话虽如此,我认为 echo 和 cut 是两个危害最小的命令 :) 但是,为了完整起见,我肯定会立即更新示例。干杯。
    • 如何将输出分配给变量?如果我这样做 var = "system-source-yyyymmdd.dat" | cut -d'-' -f2 不起作用。
    • 太棒了 - 3 分钟内得到答复 - 这比给朋友打电话还快! - 最初作为答案添加,但在我提出问题 6 年后被删除 :)
    【解决方案2】:

    仅使用内置函数的一个漂亮而优雅的(在我看来 :-) 是将其放入数组中

    var='system-source-yyyymmdd.dat'
    parts=(${var//-/ })
    

    然后,你可以在数组中找到零件...

    echo ${parts[0]}  ==> system
    echo ${parts[1]}  ==> source
    echo ${parts[2]}  ==> yyyymmdd.dat
    

    警告:如果文件名包含“奇怪”字符(例如空格,或者天堂禁止、引号、反引号...

    【讨论】:

      【解决方案3】:

      根据您的需要,awk 比 cut 更灵活。第一个预告片:

      # echo "system-source-yyyymmdd.dat" \
          |awk -F- '{printf "System: %s\nSource: %s\nYear: %s\nMonth: %s\nDay: %s\n",
                    $1,$2,substr($3,1,4),substr($3,5,2),substr($3,7,2)}'
      System: system
      Source: source
      Year: yyyy
      Month: mm
      Day: dd
      

      问题在于,将 awk 描述为“更灵活”当然就像将 iPhone 称为增强型手机一样 ;-)

      【讨论】:

        【解决方案4】:

        使用cut 命令。

        例如

        echo "system-source-yyyymmdd.dat" | cut -f1 -d'-'
        

        将提取第一位。

        更改-f 参数的值以获得适当的部分。

        这是Cut 命令的指南。

        【讨论】:

          【解决方案5】:

          另一种方法是使用shell内部的解析工具,这样可以避免创建子进程的成本:

          oIFS=$IFS IFS=- 文件="系统源-yyyymmdd.dat" 设置$文件 IFS=$oIFS echo "来源是 $2"

          【讨论】:

            【解决方案6】:

            执行此操作的最简单(也是 IMO 最好的方法)就是使用 read

            $ IFS=-. read system source date ext << EOF
            > foo-bar-yyyymmdd.dat
            > EOF
            $ echo $system
            foo
            $ echo $source $date $ext
            bar yyyymmdd dat
            

            这个主题有很多变体,其中很多都依赖于 shell:

            bash$ IFS=-. read system source date ext &lt;&lt;&lt; foo-bar-yyyymmdd.dat

            echo "$name" | { IFS=-. read system source date ext
               echo In all shells, the variables are set here...; }
            echo but only in some shells do they retain their value here
            

            【讨论】:

              猜你喜欢
              • 2016-06-15
              • 1970-01-01
              • 1970-01-01
              • 2011-05-16
              • 2012-09-13
              • 2018-08-30
              • 1970-01-01
              • 1970-01-01
              • 2013-08-30
              相关资源
              最近更新 更多