我的字符串可以是以下两种格式之一:
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
关于regex - 使用 awk 从字符串中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28935477/