【问题标题】:extracting string from a line in Unix从Unix中的一行中提取字符串
【发布时间】:2018-05-29 12:18:58
【问题描述】:

我有一个包含内容的文件:

code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}

预期输出:

code_name:00:12 29.05.2018 {1705}

我正在尝试以下命令,但没有给出结果:

sed '/\bvertical.*\]/d' file_name

我错过了什么吗?

【问题讨论】:

    标签: regex linux sed ksh


    【解决方案1】:

    您需要使用替换命令 - d 用于在给定正则表达式匹配时删除整行

    $ sed 's/\bvertical.*\]//' ip.txt 
    code_name:00:12  29.05.2018 {1705}
    
    $ # ] doesn't require escaping
    $ sed 's/\bvertical.*]//' ip.txt 
    code_name:00:12  29.05.2018 {1705}
    


    注意*是贪心的,所以.*]会尽量匹配

    $ echo 'good foo [123] baz [456]' | sed 's/foo.*]//'
    good 
    
    $ # this will delete only up to first ] after 'foo'
    $ echo 'good foo [123] baz [456]' | sed 's/foo[^]]*]//'
    good  baz [456]
    

    【讨论】:

    • 啊,我没有意识到-d 会删除整行,谢谢:)
    【解决方案2】:

    即使问题没有用awk 标记,使用这个工具提取一些列也很容易:

    awk '{print $1,$(NF-1),$NF}' <<< "code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}"
    

    NF表示当前行的字段数,所以$NF是该行的最后一个元素。

    【讨论】:

      【解决方案3】:

      如果您文件中的记录始终采用这种形状,由空格分隔的 8 个字段,那么 awk 可能是一个更简单的解决方案:

      > cat file_name 
        code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}
      > cat file_name | awk '{ print $1, $7, $8 }'
        code_name:00:12 29.05.2018 {1705}
      

      以上awk脚本含义,对于每条记录,打印第1、7、8个字段。

      【讨论】:

        猜你喜欢
        • 2020-04-11
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多