linux - 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
但它会转储文件中的所有条目。我究竟做错了什么?
解决方案
sed
进行替换并打印每一行,无论是否发生替换。你的正则表达式是错误的。
-E
如果给出扩展的正则表达式标志( ),它将仅匹配由空格分隔的三个数字。没有它,甚至没有,因为该+
符号将按字面解释。最好的方法是使用地址并且只打印匹配的行:
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
命令的行才会被打印。
推荐阅读
- javascript - 将 jQuery Deferred 与包含 $.each 的多个 ajax 一起使用
- node.js - VSCode 扩展 REST 调用不起作用
- liquibase - createProcedure 和 dropProcedure 属性
- azure - Azure RM 模板。在不删除子网的情况下更改 vNet 的 DNS 服务器
- python - 在运行其他功能时,tkinter 有没有办法每秒更新一次画布,直到经过一定时间?
- c++ - 来自注入的 .dll 的管道冻结直到进程终止
- javascript - 使用 axios 的多个请求,无需等待所有请求完成
- unity3d - 播放器预制脚本执行顺序
- python - Pymongo:如何在 MongoDB 中查询现有和非空字符串字段?
- java - 如何在 Android Studio 中使用 URL 调用 Web api 函数?