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

标签 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 命令吗?该命令对两种字符串都执行此操作?

最佳答案

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

相关文章:

ubuntu - 当我尝试在 .bashrc 中添加命令时找不到命令消息

java - 仅从字符串中检索给定的单词

java - 关于比较两个字符串

linux - 根据某些条件更新文件中的单个列

java - 将前导零添加到字符串

javascript - 计算字符串第一个字符前的空格

regex - 在 bash 中通过正则表达式进行 Grep 哈希

javascript - 如何匹配除逗号以外的所有特殊字符

python - 使用正则表达式从 url 中提取子路径

.net - 正则表达式匹配第二行