【问题标题】:Extract values after the 2nd occurrence of _ (underscore) and before dot (.) in bash在 bash 中第二次出现 _(下划线)和点 (.) 之前提取值
【发布时间】:2017-01-23 14:35:41
【问题描述】:

我在一个临时目录中有一个文件,其中写了一些行。我的目标是提取第二个下划线和点 (.) 之间的值。例如,

这里是filesample.txt的内容示例:

--rwxr-x---                    235 2016-08-24 05:13 File_Name_2696553.txt
--rwxr-x---                   1274 2016-09-14 04:44 File_Name_2852659.xls
--rwxr-x---                   1802 2016-09-14 05:04 File_Name_2852992.pdf

我所做的如下:

cat ${tmp}filesample.txt | cut -b64- | awk -F"." '{ print $1 }'

这给了我想要的输出。但是,我认为更好的解决方案是让代码看起来介于第二个下划线和点之间。

这样,如果每行内容末尾的 7 位数字变为 8 或更多,我不必回到我的脚本并调整它,因为 cut -b64- 正在查看第 64 个位置字节.

这可能是一个基本问题,我是 bash 脚本的新手。

【问题讨论】:

    标签: bash awk cut cat


    【解决方案1】:

    你可以使用awk:

    awk '{split($NF, a, "[_.]"); print a[3]}' file
    

    测试:

    $ awk '{split($NF, a, "[_.]"); print a[3]}' file
    2696553
    2852659
    2852992
    

    【讨论】:

    • 使用此解决方案:awk '{split($NF, a, "[_.]"); print a[3]}' <<< 'a.b.c.d_123_xyz.jpg' 将返回 c 但我相信 OP 正在寻找 xyz
    【解决方案2】:

    要获得第二个_ 和下一个DOT 之间的值,您可以使用:

    awk '{split($NF, a, /_/); sub(/\..*/, "", a[3]); print a[3]}' filesample.txt
    
    2696553
    2852659
    2852992
    
    • 使用split 函数,我们将最后提交的文件由_(下划线)分割并取a[3],这是第二个_ 之后的值
    • 然后使用sub 函数我们剥离DOT 之后的所有内容,从而为我们提供第二个_ 和下一个DOT 之间的值

    【讨论】:

    • 这条线在做什么?你能解释一下吗?
    • 在答案中添加了解释。
    【解决方案3】:
    $ cat ip.txt 
    --rwxr-x---                    235 2016-08-24 05:13 File_Name_2696553.txt
    --rwxr-x---                   1274 2016-09-14 04:44 File_Name_2852659.xls
    --rwxr-x---                   1802 2016-09-14 05:04 File_Name_2852992.pdf
    
    $ grep -oP '.*_\K\d+' ip.txt 
    2696553
    2852659
    2852992
    
    • o 只输出匹配的文本
    • P 使用基于 perl 的正则表达式
    • .*_ 以贪婪的方式将文本匹配到 _
    • \K 使用正向后视,匹配的文本在此之前不会成为输出的一部分
    • \d+ 一位或多位数字

    【讨论】:

      【解决方案4】:

      使用 sed:

      $ sed 's/.*_\([^.]*\).*/\1/' filesample.txt
      2696553
      2852659
      2852992
      

      它捕获并输出最后一个下划线和最后一个点之间的值。

      【讨论】:

        【解决方案5】:
        awk -F'[_.]' '{print $(NF-1)}' file
        
        2696553
        2852659
        2852992
        

        【讨论】:

        • 那就让我们改进吧:)!
        猜你喜欢
        • 2018-03-17
        • 1970-01-01
        • 2017-08-08
        • 2020-02-27
        • 2012-01-29
        • 2021-04-06
        • 1970-01-01
        • 2017-07-11
        • 1970-01-01
        相关资源
        最近更新 更多