将两个正则表达式组合在一起

时间:2017-07-07 14:45:35

标签: regex bash

我有一个我要解析的ps ax列表中的表达式:

183838 ? myprocess -uuid 0f6309e3-bee2-4747-b76d-7aaf4d0f074e serial=802e7fd9-a2ab-e411-8000-001e67ca95b2

我想匹配进程ID(183838)和uuid表达式(0f6309e3-bee2-4747-b76d-7aaf4d0f074e)。

我有两个匹配它们的正则表达式:

# PID
([0-9]*)
# UUID
(?<=uuid).([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})

但我无法找到如何将它们组合在一起,以便将结果与sed

结合起来
183838 0f6309e3-bee2-4747-b76d-7aaf4d0f074e

awk不是一个选项,因为它必须与列号无关。

3 个答案:

答案 0 :(得分:2)

您可以在两个正则表达式之间的正则表达式中使用|或运算符来组合它们。

答案 1 :(得分:0)

Bash使用POSIX ERE,你有一个带有lookbehind的PCRE。如果您需要PCRE,grep -P是一个选项,与-o结合使用,可以选择只匹配匹配行的匹配部分:

$ ps ax | grep -oP '(^[0-9]+)|(?<=uuid )([-0-9a-f]{36})' | paste -sd' '
183838 0f6309e3-bee2-4747-b76d-7aaf4d0f074e

(我们在这里将多行与paste组合在一起。)

答案 2 :(得分:0)

您可以与捕获群组进行此类匹配。它们由sed中的\(\)括起来。在替换中,\1被替换为与第一个捕获组的内容匹配的任何内容,依此类推。

所以翻译你的输入字符串:

$ ps ax | grep -- '-uuid' | sed 's/\([0-9]*\).* -uuid \([0-9a-f-]*\).*/\1 \2/'
183838 0f6309e3-bee2-4747-b76d-7aaf4d0f074

我已经使用了&#34; -uuid&#34;作为定位弦的正确部分的锚点,为uuid本身提供更短更松弛的图案。但是你可以根据自己的要求进行调整。