如何为此编写一个正则表达式?

时间:2019-01-18 19:41:23

标签: regex grep cut

要求:仅grep / cut / join / regex。

我有这样的数据:

  798 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
15386 /usr/bin/nautilus --gapplication-service
16051 /usr/bin/zeitgeist-daemon

我想从数字中提取行数据到第二个结尾空间,例如

798 /usr/bin/dbus-daemon

仅使用带有或不带有正则表达式的grep / cut / join。

我尝试过

grep -oe "[^ ][^ ]*  *[a-zA-Z\]*$"

但结果与预期不符。

1 个答案:

答案 0 :(得分:1)

您可以使用

# With GNU grep:
grep -oP '^\s*\K\S+\s+\S+' <<< "$s"
# With a POSIX ERE pattern:
grep -oE '[0-9][^ ]* +[^ ]+' <<< "$s" 

请参见online demo

  • o-匹配输出模式(非行)
  • P-使用PCRE正则表达式引擎来解析模式

PCRE模式的详细信息:

  • ^-行首
  • \s*-超过0个空格
  • \K-匹配重置运算符会丢弃到目前为止匹配的整个文本
  • \S+-1个以上非空格字符
  • \s+\S+-1 +空格和1 +非空格字符。

POSIX ERE模式匹配

  • [0-9]-一个数字
  • [^ ]*-空格以外的0+个字符
  • +-1个或更多空格
  • [^ ]+-空格以外的1个以上字符。