繁体   English   中英

使用awk从字符串中提取子字符串

[英]Extract substring from a string using awk

我有可以是以下两种格式之一的字符串:

dts12931212112 : some random message1 : abc, xyz
nodts : some random message2

我需要从这两个没有'dts'部分的字符串中提取子字符串,即它应该返回:

some random message1 : abc, xyz
some random message2

我需要在bash脚本中执行此操作。

您可以使用awk命令为我提供帮助吗,这两种类型的字符串都可以执行此操作?

通过awk的gsub函数。

$ awk '{gsub(/^[^:]*dts[^:]*:|:[^:]*dts[^:]*/, "")}1' file
 some random message1 : abc, xyz
 some random message2
$ awk '{gsub(/^[^:]*dts[^:]*:[[:blank:]]*|:[^:]*dts[^:]*/, "")}1' file
some random message1 : abc, xyz
some random message2

您也可以在sed中应用相同的正则表达式,但是您需要启用-r --regexp-extended参数。

^断言我们是开始。 [^:]*否定的字符类,与任何字符匹配,但不匹配: ,零次或多次。 因此,此^[^:]*dts[^:]*:将与开头包含dts的子字符串匹配。 如果子字符串位于中间,则不会碰。 这个:[^:]*dts[^:]*模式匹配具有dts的中间或最后一个子字符串。 最后,将匹配的字符替换为空字符串将为您提供所需的输出。

更新:

$ awk '{gsub(/^[^[:space:]]*dts[^[:space:]]*[[:space:]:]*|[[:space:]:]*[^[:space:]]*dts[^[:space:]]*/, "")}1' file
some random message1 : abc, xyz
some random message2

这是另一个awk

awk -F" : " '{$1="";sub(FS,"")}1' OFS=" : " file
some random message1 : abc, xyz
some random message2

只需将第一个字段分开即可:


另一个版本:

awk -F" : " '{print substr($0,index($0,$2))}' file
some random message1 : abc, xyz
some random message2

从第二个字段获取所有数据,并以分隔:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM