【问题标题】:Unix: Cut a string along with delimiterUnix:将字符串与分隔符一起剪切
【发布时间】:2016-11-09 14:03:26
【问题描述】:

我正在使用以下命令根据分隔符剪切字符串。但我希望输出与分隔符一起打印。

示例字符串: test_file.txt

命令:

echo "test_file.txt" | cut -sd_ -f1

当前输出:测试

预期输出:test_

编辑:如果字符串不包含分隔符,我正在使用 cut -sd 报告 null。所以如果分隔符不存在,我也应该将输出设为空。

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    如果您使用的是 BASH,则不需要外部工具:

    s='test_file.txt'
    [[ $s == *_* ]] && echo "${s%%_*}"_
    
    test_
    

    或者使用sed:

    sed -n 's/_.*/_/p' <<< "$s"
    
    test_
    

    或者使用awk

    awk -F_ 'NF>1{print $1 FS}' <<< "$s"
    
    test_
    

    【讨论】:

    • 感谢您的快速解决方案。我在 cut 命令中使用 sd,因此如果没有分隔符,它会报告 null。这也可以通过上面的命令来完成吗?例如如果我使用 testfile.txt,由于不存在分隔符,我应该将输出设为 null
    • 是的,我编辑的答案中的所有选项都会解决这个问题。
    • 非常感谢 :) 干杯
    【解决方案2】:

    cut 无法做到这一点,但sed 可以做到这一点:

    $ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/'
    test_
    

    如果你不想在没有_的情况下打印任何东西,最简单的方法可能是分别清除这些行,

    $ echo "test_file.txt" | sed '/^[^_]*$/d; s/\([^_]*_\).*$/\1/'
    

    【讨论】:

    • 感谢您的快速解决方案。我在 cut 命令中使用 sd,因此如果没有分隔符,它会报告 null。这也可以通过 sed 完成吗?例如如果我使用 testfile.txt,由于不存在分隔符,我应该将输出设为 null。
    • 我原来的命令会让不包含_的行保持不变;我添加了另一个按照您的要求运行的选项。
    【解决方案3】:
     echo "test_file.txt"  |grep -oP '^.*?_'
     test_
    

    这将打印从行首到 first 分隔符 (_) 的任何内容,包括分隔符。

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 2019-08-29
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多