【问题标题】:How to delete a line up to the last instance of a specific character using bash?如何使用bash删除直到特定字符的最后一个实例的行?
【发布时间】:2014-04-26 22:58:41
【问题描述】:

我有一个由 md5 生成的包含数千行的文件,其中包含哈希,然后是每行的路径。我正在搜索数百个 sed 示例,但无法完全破译它们。

我如何将每行的最后一个斜杠包括在内,然后只输出文件名?

fd373e07fd6f85085455a7d03a6ea8d8 /Volumes/yadda/20121007-083424-MDT-5DM35545.CR2
b4108ee8509dbfd0e8fd93effbb2c87f /Volumes/yadda/20121007-083424-MDT-5DM35546.CR2
98188a4e073a65d39840b34446228533 /Volumes/yadda/20121007-083424-MDT-5DM35547.CR2
7fe69f18e1a216a7a68812b1b3322764 /Volumes/yadda/20121007-083424-MDT-5DM35548.CR2
7b48289014eddab153a819a460a46f83 /Volumes/yadda/20121007-083424-MDT-5DM35549.CR2
832f43451691fa4e8577f66820f8714c /Volumes/yadda/20121007-083424-MDT-5DM35550.CR2

对于输出,我只需要文件名:

5DM35545.CR2
5DM35546.CR2
5DM35547.CR2
5DM35548.CR2
5DM35549.CR2
5DM35550.CR2

我知道我可以只删除哈希然后使用 basename,但我希望在一次操作中完成,并学习一点 sed。

感谢您没有破坏新手。

【问题讨论】:

  • 你可以试试awk,它可能比sed 使用起来更简单,而且网上有很多文档。基本上你告诉awk你的字段分隔符是-,然后输出最后一个字段。

标签: string bash unix split


【解决方案1】:
awk -F- '{ print $NF }' input.txt

-F 告诉awk 字段分隔符,在您的情况下应该是-$NF 表示最后一个字段。 input.txt 应该是具有文件名的文件,每个文件位于不同的行。

【讨论】:

    【解决方案2】:

    你可以这样做

    sed 's|.*-MDT-||' data_file
    

    这个正则表达式删除每一行中 -MDT 之前的所有内容

    【讨论】:

    • 由于您的正则表达式包含.*,因此您最多只能期望一个匹配项,因此g 标志是多余的。
    【解决方案3】:

    我不知道您将如何处理这些名称,但如果稍后要在对您的文件运行循环的脚本中使用它们,您不妨在循环中包含此转换:

    #!/bin/bash
    
    while read -r md5 file; do
        [[ -z $md5 ]] && continue
        base=${file##*-}
        echo "md5: $md5"
        echo "file:$file"
        echo "base: $base"
    done < input.txt
    

    测试。

    $ while read -r md5 file; do
        [[ -z $md5 ]] && continue
        base=${file##*-}
        echo "md5: $md5"
        echo "file:$file"
        echo "base: $base"
    done <<EOF
    fd373e07fd6f85085455a7d03a6ea8d8 /Volumes/yadda/20121007-083424-MDT-5DM35545.CR2
    b4108ee8509dbfd0e8fd93effbb2c87f /Volumes/yadda/20121007-083424-MDT-5DM35546.CR2
    98188a4e073a65d39840b34446228533 /Volumes/yadda/20121007-083424-MDT-5DM35547.CR2
    7fe69f18e1a216a7a68812b1b3322764 /Volumes/yadda/20121007-083424-MDT-5DM35548.CR2
    7b48289014eddab153a819a460a46f83 /Volumes/yadda/20121007-083424-MDT-5DM35549.CR2
    832f43451691fa4e8577f66820f8714c /Volumes/yadda/20121007-083424-MDT-5DM35550.CR2
    EOF
    md5: fd373e07fd6f85085455a7d03a6ea8d8
    file:/Volumes/yadda/20121007-083424-MDT-5DM35545.CR2
    base: 5DM35545.CR2
    md5: b4108ee8509dbfd0e8fd93effbb2c87f
    file:/Volumes/yadda/20121007-083424-MDT-5DM35546.CR2
    base: 5DM35546.CR2
    md5: 98188a4e073a65d39840b34446228533
    file:/Volumes/yadda/20121007-083424-MDT-5DM35547.CR2
    base: 5DM35547.CR2
    md5: 7fe69f18e1a216a7a68812b1b3322764
    file:/Volumes/yadda/20121007-083424-MDT-5DM35548.CR2
    base: 5DM35548.CR2
    md5: 7b48289014eddab153a819a460a46f83
    file:/Volumes/yadda/20121007-083424-MDT-5DM35549.CR2
    base: 5DM35549.CR2
    md5: 832f43451691fa4e8577f66820f8714c
    file:/Volumes/yadda/20121007-083424-MDT-5DM35550.CR2
    base: 5DM35550.CR2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多