【问题标题】:How to cut the last field from a shell string如何从shell字符串中剪切最后一个字段
【发布时间】:2011-06-01 13:46:54
【问题描述】:

如何剪切这个shell字符串中的最后一个字段

LINE="/string/to/cut.txt"

让字符串看起来像这样

LINE="/string/to/"

提前致谢!

【问题讨论】:

    标签: string shell cut


    【解决方案1】:

    不管怎样,基于cut 的解决方案:

    NEW_LINE="`echo "$LINE" | rev | cut -d/ -f2- | rev`/"
    

    【讨论】:

    • 我相信这是切断第一个字段,而不是最后一个?
    • @Michael:我在这里进行了一些测试,它似乎工作正常。它确实剪切了第一个字段,但它(相当低效)反转了前后的字符串,这具有预期的整体效果。
    • 我可以确认这在 Unix 和 GNU 的 cut 实现中确实有效。显然,dirname 答案对于 OPs 特定用例来说更好,但我在寻找一种用 cut 删除最后一个字段的通用方法时发现了这一点,就是这样。
    • @LucasJones 值得注意的是,这在多行输入上效率要高很多倍,因为dirname 一次只能在一条路径上运行。例如,在find 输出上,dirname 的替代选项是find ... -exec dirname {} \;-exec 让它变得非常慢。
    【解决方案2】:

    我认为你可以使用“dirname”命令。它接受输入文件路径,删除文件名部分并返回路径。例如:

    $ dirname "/string/to/cut.txt"
    /string/to
    

    【讨论】:

      【解决方案3】:

      这将适用于现代 Bourne 版本,如 Dash、BusyBox ash 等,以及 Bash、Korn shell 和 Z shell 等后代。

      LINE="/string/to/cut.txt"
      LINE=${LINE%/*}
      

      或保留最后的斜线:

      LINE=${LINE%/*}/
      

      【讨论】:

      • 这应该是公认的答案,因为它是最快和最便携的解决方案,因为它可以在任何符合 POSIX 的 shell 中工作,而无需 fork
      【解决方案4】:
      echo "/string/to/cut.txt" | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}'
      

      【讨论】:

      • 我们如何使用 cut 来做到这一点?
      • @user558134 - 不太确定最后一个字段的剪切支持变量,awk 更优雅
      • awk 用更少的代码更轻松地解决了我的问题,感谢您的提示。
      【解决方案5】:

      echo $LINE | grep -o '.*/' 也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 2015-07-29
        • 1970-01-01
        相关资源
        最近更新 更多