如何用Linux命令截取字符串中Id至首个逗号间的内容?
提取目标Id的解决方案
嘿,我来帮你搞定这个问题!你的原始字符串虽然存在JSON语法错误(比如括号不匹配、缺少分隔符),但我们完全可以用文本处理工具精准提取出需要的Id值,最终得到「Id:17 Id:19」的结果。下面给你两种实用方案:
方案一:用grep的Perl正则模式(推荐,简洁高效)
利用grep的Perl正则匹配能力,直接捕获Id":"后面的数字,再拼接成目标格式:
# 假设你的字符串通过管道输入,或存储在input.txt文件中 echo '[{"value":1,"btata":"15","Id":"17","","url":"","time":"222"{"value":1,"secId":"16","Id":"19","time":"20218 22status":""}' | grep -oP 'Id":"\K\d+' | sed 's/^/Id:/' | tr '\n' ' '
命令解释:
-o:只输出匹配到的内容,而非整行文本-P:启用Perl兼容正则表达式,支持更灵活的匹配规则Id":"\K\d+:\K会忽略前面匹配的Id":",只捕获后面的连续数字(\d+表示一个或多个数字)sed 's/^/Id:/':给每个捕获到的数字前缀加上Id:,形成目标格式tr '\n' ' ':把每行结果的换行符替换为空格,最终得到连续的目标字符串
方案二:用sed实现(适配你之前的尝试思路)
如果你更倾向于用sed完成,可以通过捕获组提取数字并格式化:
echo '[{"value":1,"btata":"15","Id":"17","","url":"","time":"222"{"value":1,"secId":"16","Id":"19","time":"20218 22status":""}' | sed -n 's/.*Id":"\([0-9]*\).*/Id:\1/p' | tr '\n' ' '
命令解释:
-n:默认不输出任何内容,仅打印我们指定的匹配结果s/.*Id":"\([0-9]*\).*/Id:\1/p:用捕获组\([0-9]*\)匹配Id":"后面的数字,将整行替换为Id:加捕获到的数字,p表示打印替换后的内容tr '\n' ' ':同样把换行符替换为空格,得到最终的目标格式
这两种方案都不依赖正确的JSON格式,完全基于文本模式匹配,能轻松处理你给出的字符串。
内容的提问来源于stack exchange,提问作者Moe
相关产品推荐
相关产品推荐

