【问题标题】:How to write a regex for this?如何为此编写正则表达式?
【发布时间】:2019-01-18 19:41:23
【问题描述】:

要求:仅 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\]*$"

但结果并不如预期。

【问题讨论】:

  • 如果您有 GNU grep,请尝试 grep -oP '^\s*\K\S+\s+\S+'。使用 POSIX ERE,您可以尝试类似 grep -oE '[0-9][^ ]* +[^ ]+'
  • 你已经排除了 awk,它应该是 awk '{print $1, $2}'
  • 是的,我知道 awk。但我受到限制,不能使用awk
  • @wiktor-stribiżew 它奏效了。谢谢。如果可能,请将其添加为答案。
  • 如果数字在字符串的开头^[0-9]+ [^ ]+

标签: regex grep cut


【解决方案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+ 个字符而不是空格。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多