Text-Processing

正則表達式會在字元串之後 grep 時間

  • November 5, 2022

所以,我正在嘗試為我的 dwmblocks 狀態欄編寫一個腳本,我想要一個小模組來檢查日落和日出時間。顯然,這個網站可以幫助我做同樣的事情,但我不知道如何從 curl 文件中提取日出和日落值。

curl v2.wttr.in/nyc | grep (the values after 'Sunrise:  ' and 'Sunset:  ')

你能做一個正則表達式來返回沒有’Sunrise:‘和’Sunset:‘的值嗎

如果您grep-P-o選項。

$ curl -s v2.wttr.in/nyc | grep -Po 'Sun(rise|set):.*?\K\d+:\d+:\d+'
07:31:15
17:47:15

.*?跳過盡可能少的字元,直到digits:digits:digits找到模式。這會跳過空格,但也會跳過在那裡找到的著色轉義序列。\K告訴是-o開始的部分輸出(K從比賽中得到什麼)。

使用Raku(以前稱為 Perl_6)

raku -ne 'my @a = .split("|").map: *.trim; \
         .[2].put if .contains("Sunrise" | "Sunset") for @a.map: *.split( / \s+ /);'

或者

raku -ne 'my @a = .split("|").map: *.trim; \
         .put for @a.grep(/ Sunrise | Sunset /).map: *.split(/ \s+ / ).[2];' 

OP 編輯的頁面似乎curl是一個高度結構化的文件,因此請利用該屬性。上面的程式碼(兩個範例)採用行,將它們在|bar 上拆分為單獨的列,並將結果儲存在數組 ( @a) 中。

第一個例子:在第二個語句中,元素@asplit\s+鍵/值中。這些鍵/值通過 with 迭代,如果它是和/或字元串,則for僅顯示[2]第三個(值)子元素。contains``Sunrise``Sunset

第二個範例:遍歷@a數組的元素,直到找到與or的匹配項。然後任何ped 元素進入鍵/值,並返回值(索引)。grep``Sunrise``Sunset``grep``split``\s+``[2]


上面的 Raku 答案的優點是您返回與“日出”或“日落”相關的值,無論它們是什麼。例如,如果站點切換到 12 小時制,您會收到AM/PM返回的資訊。或者,@StéphaneChazelas 的出色答案實際上選擇了冒號分隔的數字。使用 Raku,您可以類似地“加倍努力”並comb通過第三個(值)子元素獲得正確的數字模式:

.comb(/ [\d**2] ** 3 % \: /)

Raku 正則表達式 incomb可以如下解讀:查找並返回匹配\d**2數字對,重複** 33 次,內部用冒號分隔 ( %)\:

把它們放在一起:

raku -ne 'my @a = .split("|").map: *.trim; \
         .comb(/ [\d**2] ** 3 % \: /).put for @a.grep(/ Sunrise | Sunset /).map: *.split(/ \s+ / ).[2];'

或者

raku -ne 'my @a = .split("|").map: *.trim; .[2].comb(/ [\d**2] ** 3 % \: /).put if .contains("Sunrise" | "Sunset") for @a.map: *.split( / \s+ /);'

以上述結構化方式分解文本可確保您只獲得dd:dd:dd與“日出”或“日落”相關的時間。當然,您可以隨意組合/刪除上面所有 4 個程式碼範例中的辨識元素,只要您認為合適。

範例輸出(上面所有 4 個程式碼範例):

07:31:15
17:47:15

https://rakudo.org

https://raku.org

引用自:https://unix.stackexchange.com/questions/723733