首页 > 解决方案 > sed:从匹配正则表达式的行中过滤字符串子集

问题描述

我有以下格式的文件:

abc: A B C D E
abc: 1 2 3 4 5 
def  D E F G H
def: 10 11 12 23 99
...

':' 之后的第一行字符串是下一行数字的标题。我想sed只提取一行以PATTERN字符串开头的行,其中包含数字。

一行中的数字数量是可变的,但假设我确切知道我期待多少,所以我尝试了这个命令:

% sed 's/^abc: \([0-9]+ [0-9]+ [0-9]+\)$/\1/g' < file.txt

但它会转储文件中的所有条目。我究竟做错了什么?

标签: linuxbashmacossedscripting

解决方案


  1. sed进行替换并打印每一行,无论是否发生替换。

  2. 你的正则表达式是错误的。-E如果给出扩展的正则表达式标志( ),它将仅匹配由空格分隔的三个数字。没有它,甚至没有,因为该+符号将按字面解释。

  3. 最好的方法是使用地址并且只打印匹配的行:

sed -nE '/^abc: [0-9]+ [0-9]+ [0-9]+ [0-9]+ [0-9]+$/p' < file.txt

或更好,

sed -nE '/^abc:( [0-9]+){5}$/p' < file.txt

该标志禁用(1)-n中描述的“打印所有行”行为。sed只有到达p命令的行才会被打印。


推荐阅读