【问题标题】:Print only regular expression match with sed command使用 sed 命令仅打印正则表达式匹配
【发布时间】:2022-11-16 21:35:05
【问题描述】:

我写信是想请你帮我解决以下问题。

我的 Debian 系统上“timedatectl”的输出是:

Local time: Wed 2022-11-16 13:02:00 CET
           Universal time: Wed 2022-11-16 12:02:00 UTC
                 RTC time: Wed 2022-11-16 12:02:01
                Time zone: Europe/Rome (CET, +0100)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no

我怎样才能使用 sed 命令只获得“Europe/Rome”字符串,或者显然是任何其他字符串?

我试过了

timedatectl | sed -ne 's/^ *Time zone: \([A-z0-9_\/]*\).*$/\1/p'

但返回以下消息:

sed:-e 表达式 #1,字符 40:范围结束无效

非常感谢您!

【问题讨论】:

  • 使用:sed -n 's~^ *Time zone: \([A-Za-z0-9_/]*\).*$~\1~p'

标签: regex linux sed timezone


【解决方案1】:

您的括号表达式包含 A-z 范围,该范围不适用于您当前的归类规则。如果您在 sed 命令之前添加 LC_ALL=C,它不会出错,但它仍然会使它成为一个错误的正则表达式,因为 A-z ASCII 字符范围也是 matches some non-letter symbols。用[:alnum:]替换A-z0-9是有意义的。

因此,您可以修复正则表达式并使用 's/^ *Time zone: ([[:alnum:]_/]*).*$//p' 或只捕获那里的任何非空白:

sed -n 's/^ *Time zone: ([^ ]*).*//p'

细节:

  • -n - 抑制默认行输出
  • ^ *Time zone: ([^ ]*).* - 找到以零个或多个空格开头,然后是 Time zone: 字符串的行,然后将空格以外的任何零个或多个字符捕获到第 1 组(使用 ([^ ]*))和该行的其余部分(使用.*),
  • - 用第 1 组值替换匹配项
  • p - 打印成功替换的结果

online demo

#!/bin/bash
s='Local time: Wed 2022-11-16 13:02:00 CET
           Universal time: Wed 2022-11-16 12:02:00 UTC
                 RTC time: Wed 2022-11-16 12:02:01
                Time zone: Europe/Rome (CET, +0100)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no'
sed -n 's/^ *Time zone: ([^ ]*).*$//p' <<< "$s"

输出:

Europe/Rome

【讨论】:

  • 非常感谢您非常清楚的解释!
【解决方案2】:

使用sed

$ sed -En '/Time zone/s~[^/]* ([^ ]*).*~~p' input_file
Europe/Rome

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 2015-02-24
    • 2012-03-24
    • 1970-01-01
    • 2017-04-13
    • 2018-05-31
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多