如何用sed、awk命令行工具提取冒号间的指定字段?
用sed/awk提取目标字段的实现方案
需求说明
给定文件内容:
#set_property board_part my.biz:ab0860_1cf:part0:1.0 [current_project]
set_property board_part my.biz:ab0820_1ab:part0:1.0 [current_project]
需要提取非注释行(不以#开头)中board_part对应值里第一个冒号与第二个冒号之间的内容,最终输出:
ab0820_1ab
方法1:sed命令实现
直接通过sed的正则匹配与捕获完成提取:
sed -n '/^[^#]/s/.*board_part.*:\([^:]*\):.*/\1/p' 你的文件名
命令解释
-n:抑制默认输出,只打印指定内容/^[^#]/:匹配所有不以#开头的非注释行s/.*board_part.*:\([^:]*\):.*/\1/p:用正则定位board_part后的目标片段,捕获第一个:和第二个:之间的非冒号字符,将整行替换为捕获内容并打印
方法2:awk命令实现
awk有两种常见写法,可根据场景选择:
写法1:基于字段分割(简洁高效)
awk '!/^#/ {split($3, arr, ":"); print arr[2]}' 你的文件名
解释
!/^#/:跳过以#开头的注释行split($3, arr, ":"):将第3个字段(即my.biz:ab0820_1ab:part0:1.0)按:分割为数组arrprint arr[2]:数组下标从1开始,arr[2]即为第一个冒号与第二个冒号之间的内容
写法2:基于正则捕获(更通用,不依赖字段位置)
如果board_part后的字段位置不固定,用正则匹配更稳妥:
awk '!/^#/ && match($0, /board_part.*:([^:]*):/, m) {print m[1]}' 你的文件名
解释
match($0, /board_part.*:([^:]*):/, m):在当前行中匹配包含board_part的片段,将第一个:和第二个:之间的内容存入捕获组数组mprint m[1]:打印捕获到的目标内容
内容的提问来源于stack exchange,提问作者user2532296
相关产品推荐
相关产品推荐

