
だから私はdwmblocksステータスバーのスクリプトを書こうとし、夕日と日の出時間をチェックする小さなモジュールを取得したいと思います。確かに、このウェブサイト私は同じことをするのに役立ちますが、カールファイルから日の出と日没の値を把握する方法がわかりません。
curl v2.wttr.in/nyc | grep (the values after 'Sunrise: ' and 'Sunset: ')
"sunrise:" と "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
)に格納します。
最初の例:2番目のステートメントでは、要素はキー/値に配置され@a
ます。キー/値はwithで繰り返され、および/または文字列の場合は3番目(値)サブ要素のみが表示されます。split
\s+
for
[2]
contains
Sunrise
Sunset
@a
grep
2番目の例:orと一致する要素が見つかるまで配列要素を繰り返します。その後、すべてのped要素がキー/値に追加され、値(インデックス)が返されます。Sunrise
Sunset
grep
split
\s+
[2]
上記のRakuの回答の利点は、「日の出」または「日没」に関連する値が何でも返すことができることです。たとえば、サイトが12時間制に切り替えられた場合は、AM/PM
情報が再度受信されます。または@ StéphaneChazelasの優れた答えは、実際にはコロンで区切られた数字を選択します。 Rakuを使用すると、同様に「追加マイルを移動」し、comb
3番目(値)サブ要素を渡すことで正しい数値パターンを得ることができます。
.comb(/ [\d**2] ** 3 % \: /)
Rakuの正規表現はcomb
次のように解釈できます。3回繰り返し()とコロンで区切られた\d**2
数字のペアに一致するコンテンツを見つけて返します。** 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