Regex 在Unix中从行中提取字符串

Regex 在Unix中从行中提取字符串,regex,linux,sed,ksh,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'/\b垂直。*\]/d'文件名 我遗漏了什么吗?您需要使用替换命令-d用于在给定正则表达式匹配时删除整行 $ sed 's/\bvertical.*\]//' ip.txt code_

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

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'/\b垂直。*\]/d'文件名


我遗漏了什么吗?

您需要使用替换命令-
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 $1,$(NF-1),$NF}' <<< "code_name:00:12 vertical 01 1.3489:27 vsftypyre.01 [91.02.01.6] 29.05.2018 {1705}"

awk'{print$1,$(NF-1),$NF}'如果文件中的记录始终为该形状,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个字段。

啊,我没有意识到
-d
会删除整行,谢谢:)