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

时间:2015-03-09 04:53:45

标签: regex string bash shell awk

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

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

我需要从这两个没有' dts'部分即它应该返回:

some random message1 : abc, xyz
some random message2

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

你能帮助我使用awk命令,它为这两种字符串执行此操作吗?

2 个答案:

答案 0 :(得分:1)

通过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

答案 1 :(得分:1)

这是另一个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

从第二个字段获取所有数据,然后将其分隔为: