因此,我正在尝试为我的 dwmblocks 状态栏编写一个脚本,并且想要获得一个小模块来检查日落和日出时间。显然,这个网站可以帮助我做同样的事情,但我不知道如何从卷曲文件中 grep 出日出和日落值。
curl v2.wttr.in/nyc | grep (the values after 'Sunrise: ' and 'Sunset: ')
您可以制作一个正则表达式来返回不带“日出:”和“日落:”的值吗
答案1
如果您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
答案2
使用乐(以前称为 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];'
curl
OP 编辑的页面似乎是一个高度结构化的文档,因此请利用该属性。上面的代码(两个示例)采用行,将它们在|
条上分割成单独的列,并将结果存储在数组 ( @a
) 中。
第一个例子:在第二条语句中, 的元素@a
被split
放入\s+
键/值中。这些键/值通过 with 进行迭代for
,并且如果是 and/or 字符串,则仅显示第三个[2]
(值)子元素。contains
Sunrise
Sunset
@a
第二个示例:遍历数组元素,直到找到与orgrep
匹配的元素。然后,所有ped 元素都会被放入键/值中,并返回值(索引)。Sunrise
Sunset
grep
split
\s+
[2]
上面的 Raku 答案的优点是您可以返回与“日出”或“日落”相关的值,无论它们是什么。例如,如果站点切换到 12 小时时钟,您将收到AM/PM
返回的信息。或者,@StéphaneChazelas 的出色答案实际上选择了以冒号分隔的数字。使用 Raku,您可以类似地“加倍努力”并comb
通过第三个(值)子元素来获得正确的数字模式:
.comb(/ [\d**2] ** 3 % \: /)
Raku 中的正则表达式comb
可以解读如下:查找并返回与\d**2
数字对匹配的内容,重复** 3
3 次,内部用 ( %
)分隔\:
用冒号。
把它们放在一起:
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