从 Unix 中的一行中提取字符串

extracting string from a line in Unix

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

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

我是不是漏掉了什么?

您需要使用替换命令 - 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]

即使问题没有用 awk 标记,也可以很容易地使用此工具提取一些列:

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

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

如果您文件中的记录总是那种形状,8 个字段由白色分隔 space,那么 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 , ,  }'
  code_name:00:12 29.05.2018 {1705}

上面awk脚本的意思是,对于每条记录,打印第1、7、8字段。