[英]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.