簡體   English   中英

使用 sed 命令僅打印正則表達式匹配

[英]Print only regular expression match with sed command

我寫信是想請你幫我解決以下問題。

我的 Debian 系統上的“timedatectl”的 output 是:

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:范圍結束無效

非常感謝您!

您的括號表達式包含一個Az范圍,該范圍不適用於您當前的歸類規則。 如果您在sed命令之前添加LC_ALL=C ,它不會出錯,但它仍然會使它成為一個錯誤的正則表達式,因為Az ASCII 字符范圍也匹配一些非字母符號 [:alnum:]替換A-z0-9是有意義的。

因此,您可以修復正則表達式並使用's/^ *Time zone: \([[:alnum:]_\/]*\).*$/\1/p'或者只捕獲那里的任何非空格反而:

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

詳情

  • -n - 禁止默認行 output
  • ^ *Time zone: \([^ ]*\).* - 查找以零個或多個空格開頭,然后具有Time zone:字符串的行,然后將除空格以外的任何零個或多個字符捕獲到第 1 組中(使用\([^ ]*\) ) 和該行的 rest(帶.* ),
  • \1 - 用第 1 組值替換匹配項
  • p - 打印成功替換的結果

請參閱在線演示

#!/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: \([^ ]*\).*$/\1/p' <<< "$s"

Output:

Europe/Rome

使用sed

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM