我寫信是想請你幫我解決以下問題。
我的 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:范圍結束無效
非常感謝您!
uj5u.com熱心網友回復:
您的括號運算式包含的A-z
范圍不適用于您當前的歸類規則。如果你在命令LC_ALL=C
之前添加sed
,它不會出錯,但它仍然會使它成為一個錯誤的正則運算式,因為A-z
ASCII 字符范圍也匹配一些非字母符號。用 替換是有意義A-z0-9
的[:alnum:]
。
因此,您可以修復正則運算式并使用's/^ *Time zone: \([[:alnum:]_\/]*\).*$/\1/p'
或只捕獲那里的任何非空白:
sed -n 's/^ *Time zone: \([^ ]*\).*/\1/p'
詳情:
-n
- 抑制默認行輸出^ *Time zone: \([^ ]*\).*
- 找到以零個或多個空格開頭,然后是Time zone:
字串的行,然后將除空格以外的任何零個或多個字符捕獲到第 1 組(帶有\([^ ]*\)
)和該行的其余部分(帶有.*
),\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"
輸出:
Europe/Rome
uj5u.com熱心網友回復:
使用sed
$ sed -En '/Time zone/s~[^/]* ([^ ]*).*~\1~p' input_file
Europe/Rome
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535558.html
上一篇:匹配從“>”到最后一個點的字串