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

时间:2018-05-29 12:18:58

标签: regex linux sed ksh

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

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

我错过了什么吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

即使问题没有用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是该行的最后一个元素。

答案 2 :(得分:0)

如果文件中的记录始终是那个形状,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个字段。