【发布时间】: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
我错过了什么吗?
【问题讨论】:
我有一个包含内容的文件:
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]
【讨论】:
-d 会删除整行,谢谢:)
即使问题没有用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是该行的最后一个元素。
【讨论】:
如果您文件中的记录始终采用这种形状,由空格分隔的 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个字段。
【讨论】: